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

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

)

)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值