利用python HTMLParser标准库实现一个简单的爬虫

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标准库实现一个简单的爬虫

相关文章:

你感兴趣的文章:

标签云: