HTMLParser介绍 HTMLParser是Python自带的模块,能够很容易的实现HTML文件的分析。使用时需要定义一个HTMLParser的子类,并重写部分函数来实现自己想要的功能,例如: handle_starttag(tag, attrs)handle_endtag(tag, attrs)handle_endtag(tag) tag是的html
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 : a
tag : h1
data :
一个简单的爬虫
按上面的介绍写一个简单的爬虫,代码如下:
import requests
from HTMLParser import HTMLParser
class 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" % tag
def handle_data(self, data):
print "data : %s " % data.encode('utf-8')
if __name__ == '__main__':
url = 'http://www.xsec.io/'
html = requests.get(url).text
hp = 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
)
)