python中html.parser_python模块之HTMLParser简介

html.parser是一个非常简单和实用的库,它的核心是HTMLParser类。

工作的流程是:当你feed给它一个类似HTML格式的字符串时,它会调用goahead方法向前迭代各个标签,并调用对应的parse_xxxx方法提取start_tag, tag, attrs data comment和end_tag等等标签信息和数据,然后调用对应的方法对这些抽取出来的内容进行处理。整个HTMLParser的大致结构如下图所示:

python中html.parser_python模块之HTMLParser简介_第1张图片

可以发现,处理开始标签(handle_starttag)、结束标签(handle_endtag)和处理数据(handle_data)等处理函数在HTMLParser里是没有实现的(pass),这需要我们继承HTMLParser这个类的并覆盖这些方法。详细可以参阅python文档,https://docs.python.org/3/library/html.parser.html?highlight=htmlparser

一、常用方法介绍

l feed(data):主要用于接受带html标签的str,当调用这个方法时并提供相应的data时,整个实例(instance)开始执行,结束执行close()。

l handle_starttag(tag, attrs): 这个方法接收Parse_starttag返回的tag和attrs,并进行处理,处理方式通常由使用者进行覆盖,本身为空。

例如,连接的start tag是,那么对应的参数tag=’a’(小写)。attrs是start tag <>中的属性,以元组形式(name, value)返回(所有这些内容都是小写)。

例如,对于

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。可以运行看看,主要用于了解各个函数负责解析的部分,以及解析顺序

Encountered a start tag: html

Encountered a start tag: head

Encountered a start tag: title

Encountered some data : Test

Encountered an end tag : title

Encountered an end tag : head

Encountered a start tag: body

Encountered a start tag: h1

Encountered some data : Parse me!

Encountered an end tag : h1

Encountered startendtag : img

Encountered comment : comment

Encountered an end tag : body

Encountered an end tag : html

三、实用案例

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

解析的html如下

Test

Parse me!

A paragraph.

A paragraph with class.

A paragraph in div.

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

def handle_data(self, data):

if self.lasttag == 'p':

print("Encountered p data :", data)

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

def __init__(self):

HTMLParser.__init__(self)

self.flag = False

def handle_starttag(self, tag, attrs):

for attr in attrs:

if tag == 'p' and attr[1]=='"p_font":

self.flag = True

def handle_data(self, data):

if self.flag == True:

print("Encountered p data :", data)

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

def handle_starttag(self, tag, attrs):

if tag == 'p':

print("Encountered p attrs :", attrs)

4.获取p标签的class属性

def handle_starttag(self, tag, attrs):

for attr in attrs:

If tag == 'p' and attr[0]= 'class'):

print("Encountered p class :", attr[1])

5.获取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)

self.in_div = False

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

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

def __init__(self):

HTMLParser.__init__(self)

def handle_comment(self,data):

print(("Encountered comment:",data)

完整实例

例如:我们有以下一堆带HTML标签的数据

html = '''

【金冠现货/全色/顶配版】Xiaomi/小米 小米note移动联通4G手机

【购机即送布丁套+高清贴膜+线控耳机+剪卡器+电影支架等等,套餐更多豪礼更优惠】

你可能感兴趣的:(python中html.parser_python模块之HTMLParser简介)