我正在尝试构建一个网络抓取工具,抓取页面上的所有链接并将其添加到文件中。
我的Python代码包含执行以下操作的方法: -
打开指定的网页(使用urllib2模块)
检查HTTP标头内容类型是否包含 text / html
将原始HTML响应转换为可读代码并将其存储到 html_string 变量中。
下面将详细介绍Link_Finder类。
def gather_links(page_url): #page_url is relative url
html_string=''
try :
req=urllib2.urlopen(page_url)
head=urllib2.Request(page_url)
if 'text/html' in head.get_header('Content-Type'):
html_bytes=req.read()
html_string=html_bytes.decode("utf-8")
finder=LinkFinder(Spider.base_url,page_url)
finder.feed(html_string)
except Exception as e:
print "Exception " + str(e)
return set()
return finder.page_links()
link_finder.py模块使用标准Python HTMLParser 和 urlparse 模块。 Link_Finder类继承自 HTMLParser 并覆盖handle_starttag函数以获取具有href属性的所有 a 标记,并将url添加到集合(self.queue)< / p>
from HTMLParser import HTMLParser
import urlparse
class LinkFinder(HTMLParser):
def __init__(self,base_url,page_url): #page_url is relative url
super(LinkFinder,self).__init__()
self.base_url=base_url
self.page_url=page_url
self.links=set()
def handle_starttag(self,tag,attrs): #Override default handler methods
if tag==a:
for(key,value) in attrs:
if key=='href':
url=urlparse.urljoin(self.base_url,value) #Get exact url
self.links.add(url)
def error(self,message):
pass
def page_links(self): #return set of links
return self.links
我收到了异常
类型的参数&#39; NoneType&#39;是不可迭代的
我认为我使用urllib2的方式问题请求检查标题内容。 我对此有点新意,所以一些解释会很好
答案 0 :(得分:0)
我已经使用了BeautifulSoup而不是HTMLParser -
soup = BeautifulSoup(pageContent)
links = soup.find_all('a')