python爬虫html、parser_python爬虫常用HTMLParser

HtmlParser,顾名思义,是解析Html的一个工具。python自带的。

一、常用属性和方法介绍

HtmlParser是一个类,在使用时一般继承它然后重载它的方法,来达到解析出需要的数据的目的。

1.常用属性:

lasttag,保存上一个解析的标签名,是字符串。

2.常用方法:

handle_starttag(tag, attrs) ,处理开始标签,比如

;这里的attrs获取到的是属性列表,属性以元组的方式展示

handle_endtag(tag) ,处理结束标签,比如

    handle_startendtag(tag, attrs) ,处理自己结束的标签,如

handle_data(data) ,处理数据,标签之间的文本

handle_comment(data) ,处理注释,之间的文本

二、基本使用

不多说,上代码

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):

def handle_starttag(self, tag, attrs):

"""

recognize start tag, like

:param tag:

:param attrs:

:return:

"""

print("Encountered a start tag:", tag)

def handle_endtag(self, tag):

"""

recognize end tag, like

:param tag:

:return:

"""

print("Encountered an end tag :", tag)

def handle_data(self, data):

"""

recognize data, html content string

:param data:

:return:

"""

print("Encountered some data :", data)

def handle_startendtag(self, tag, attrs):

"""

recognize tag that without endtag, like

:param tag:

:param attrs:

:return:

"""

print("Encountered startendtag :", tag)

def handle_comment(self,data):

"""

:param data:

:return:

"""

print("Encountered comment :", data)

parser = MyHTMLParser()

parser.feed('

Test'

'

Parse me!

'

'')

以上是根据python手册写的基本使用,解析了一个简单的html。可以运行看看,主要用于了解各个函数负责解析的部分,以及解析顺序。

三、实用案例

以下的实用案例均在上面的代码中修改对应函数,每个实例都是单独的。

解析的html如下:

Test

Parse me!

A paragraph.

A paragraph with class.

A paragraph in div.

1.获取属性的函数,是个静态函数,新增的。直接定义在类中,返回属性名对应的属性

def _attr(attrlist, attrname):

for attr in attrlist:

if attr[0] == attrname:

return attr[1]

return None

2.获取所有p标签的文本,最简单方法只修改handle_data

def handle_data(self, data):

if self.lasttag == 'p':

print("Encountered p data :", data)

3.获取css样式(class)为p_font的p标签的文本,使用了案例1,增加一个实例属性作为标志,选取需要的标签

def __init__(self):

HTMLParser.__init__(self)

self.flag = False

def handle_starttag(self, tag, attrs):

if tag == 'p' and _attr(attrs, 'class') == 'p_font':

self.flag = True

def handle_data(self, data):

if self.flag == True:

print("Encountered p data :", data)

4.获取p标签的属性列表

def handle_starttag(self, tag, attrs):

if tag == 'p':

print("Encountered p attrs :", attrs)

5.获取p标签的class属性

def handle_starttag(self, tag, attrs):

if tag == 'p' and _attr(attrs, 'class'):

print("Encountered p class :", _attr(attrs, 'class'))

6.获取div下的p标签的文本

def __init__(self):

HTMLParser.__init__(self)

self.in_div = False

def handle_starttag(self, tag, attrs):

if tag == 'div':

self.in_div = True

def handle_data(self, data):

if self.in_div == True and self.lasttag == 'p':

print("Encountered p data :", data)

7.处理注释中的标签,若需要的数据在注释中,使用一般函数解析不到

处理方法为,写两个类,继承HTMLParser。在其中一个类的handle_comment里实例化解析类,和其他标签一样解析

这里的MyHTMLParser可以为基本使用中的MyHTMLParser,或者按需重写。

class CommentHTMLParser(HTMLParser):

def __init__(self):

HTMLParser.__init__(self)

def handle_comment(self,data):

cparser = MyHTMLParser()

cparser.feed(data)

该文章转载于这里,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值