HTMLParser介绍
HTMLParser是Python自带的模块,能够很容易的实现HTML文件的分析。使用时需要定义一个HTMLParser的子类,并重写部分函数来实现自己想要的功能,例如:
handle_starttag(tag, attrs)handle_endtag(tag, attrs)handle_endtag(tag)
tag是的html标签,attrs是 (属性,值)元组(tuple)的列表(list).HTMLParser自动将tag和attrs都转为小写,例如:
tag : h1, attrs : [(u'id', u'header-h'), (u'class', u'left')]tag : a, attrs : [(u'href', u'/')]data : Netxfly data : s Blog tag : atag : h1data :
一个简单的爬虫
按上面的介绍写一个简单的爬虫,代码如下:
import requestsfrom HTMLParser import HTMLParserclass HTMLParserTest(HTMLParser):def __init__(self):HTMLParser.__init__(self)def handle_starttag(self, tag, attrs):print "tag : %s, attrs : %s" % (tag, attrs)def handle_endtag(self, tag):print "tag : %s" % tagdef handle_data(self, data):print "data : %s " % data.encode('utf-8')if __name__ == '__main__':url = 'http://www.xsec.io/'html = requests.get(url).texthp = HTMLParserTest()hp.feed(html)
保存链接的tag
运行上面的demo后,根据输出的内容,可以确定以后tag中是带有超链接信息的:- link
tag : link, attrs : [(u'rel', u'stylesheet'), (u'href', u'http://libs.baidu.com/fontawesome/4.0.3/css/font-awesome.min.css')]
script
tag : script, attrs : [(u'src', u'http://libs.baidu.com/jquery/1.8.3/jquery.min.js')]
a
tag : a, attrs : [(u'href', u'/article/38/thread_return_value.html#comment')]
img
tag : img, attrs : [(u'src', u'/static/img/site.png'), (u'alt', u'site'), (u'id', u'header-img'), (u'class', u'left')]
form
start tag : form, attrs : [(u'id', u'comment-form'), (u'class', u'hide clear text-center form'), (u'action', u'/comment/38/'), (u'method', u'post')]
最终的爬虫
我们的爬虫暂时只需要关注上面的几种tag,根据attrs中的值,过滤出URL即可,如下所示:
class HTMLParserTest(HTMLParser):def __init__(self):HTMLParser.__init__(self)self.links = []def handle_starttag(self, tag, attrs):# print tag, attrs, type(attrs)if tag == 'link':for (k, v) in attrs:if k == 'href':self.links.append(dict(link = v))if tag == 'script':for (k, v) in attrs:if k == 'src':self.links.append(dict(script = v))if tag == 'a':for k, v in attrs:if k == 'href':self.links.append(dict(a = v))if tag == 'img':for k, v in attrs:if k == 'src':self.links.append(dict(img = v))if tag == 'form':for k, v in attrs:if k == 'action':self.links.append(dict(form = v))
原文地址:利用python HTMLParser标准库实现一个简单的爬虫, 感谢原作者分享。 答:他是憋死的,因为沙漠里没有电线杆撒尿。问: