首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写一个python脚本,以递归方式遍历页面上的链接

编写一个python脚本,以递归方式遍历页面上的链接
EN

Stack Overflow用户
提问于 2012-06-05 01:48:07
回答 5查看 8.2K关注 0票数 4

我正在为我的学校做一个项目,我想在这个项目中比较诈骗邮件。我找到了这个网站:http://www.419scam.org/emails/,现在我想做的是将每个骗局保存在单独的文档中,然后我可以分析它们。到目前为止,我的代码如下:

代码语言:javascript
复制
import BeautifulSoup, urllib2

address='http://www.419scam.org/emails/'
html = urllib2.urlopen(address).read()
f = open('test.txt', 'wb')
f.write(html)
f.close()

这将以文本格式保存整个html文件,现在我想剥离该文件并保存指向诈骗的html链接的内容:

代码语言:javascript
复制
<a href="2011-12/01/index.htm">01</a> 
<a href="2011-12/02/index.htm">02</a> 
<a href="2011-12/03/index.htm">03</a>

等。

如果我做到了这一点,我仍然需要更进一步,打开另一个保存href。你知道我如何在一段python代码中做到这一点吗?

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-06-05 02:40:23

您在BeautifulSoup中选择了正确的工具。从技术上讲,您可以在一个脚本中完成所有这些操作,但您可能希望对其进行分段,因为看起来您将处理数以万计的电子邮件,所有这些邮件都是独立的请求-而这将需要一段时间。

This page会给你很大的帮助,但这里只有一小段代码来帮助你入门。这将获取作为电子邮件索引页的所有html标记,提取它们的href链接,并在url的前面附加一点,以便可以直接访问它们。

代码语言:javascript
复制
from bs4 import BeautifulSoup
import re
import urllib2
soup = BeautifulSoup(urllib2.urlopen("http://www.419scam.org/emails/"))
tags = soup.find_all(href=re.compile("20......../index\.htm")
links = []
for t in tags:
    links.append("http://www.419scam.org/emails/" + t['href'])

're‘是Python的正则表达式模块。在第五行中,我告诉BeautifulSoup在soup中查找href属性与正则表达式匹配的所有标记。我选择这个正则表达式只获取电子邮件索引页面,而不是该页面上的所有href链接。我注意到,索引页面链接的所有URL都具有这种模式。

有了所有合适的'a‘标记,然后循环遍历它们,通过执行t' href’从href属性中提取字符串,并将URL的其余部分附加到字符串的前面,以获得原始字符串URL。

通读该文档,您应该会了解如何扩展这些技术以获取单独的电子邮件。

票数 5
EN

Stack Overflow用户

发布于 2012-06-05 02:35:57

您还可以在requestslxml.html中找到价值。请求是发出http请求的另一种方式,而lxml是解析xml和html内容的另一种选择。

有许多方法可以搜索html文档,但您可能希望从cssselect开始。

代码语言:javascript
复制
import requests
from lxml.html import fromstring

url = 'http://www.419scam.org/emails/'
doc = fromstring(requests.get(url).content)

atags = doc.cssselect('a')

# using .get('href', '') syntax because not all a tags will have an href
hrefs = (a.attrib.get('href', '') for a in atags)

或者按照使用.iterlinks()的注释中的建议。注意,如果你只想要'a‘标签,你仍然需要过滤。无论哪种方式,.make_links_absolute()调用都可能会有所帮助。不过,这是你的作业,所以你可以玩玩它。

代码语言:javascript
复制
doc.make_links_absolute(base_url=url)

hrefs = (l[2] for l in doc.iterlinks() if l[0].tag == 'a')

下一个给你的是...如何循环和打开所有单独的垃圾链接。

票数 3
EN

Stack Overflow用户

发布于 2012-06-05 02:08:56

要获取页面上的所有链接,您可以使用BeautifulSoup。看看this page吧,它可以提供帮助。它实际上告诉你如何准确地做你需要的事情。

要保存所有页面,您可以执行与在当前代码中相同的操作,但在一个循环中,该循环将遍历您提取并存储在列表中的所有链接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10885708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档