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

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

可以发现,处理开始标签(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是<a>,那么对应的参数tag=’a’(小写)。attrs是start tag <>中的属性,以元组形式(name, value)返回(所有这些内容都是小写)。

例如,对于<A HREF="http://www.baidu.com“>,那么内部调用形式为:handle_starttag(’a’,[(‘href’,’http://www.baidu.com)]).

l handle_endtag(tag):跟上述一样,只是处理的是结束标签,也就是以</开头的标签。

l handle_data(data):处理的是网页的数据,也就是开始标签和结束标签之间的内容。例如:<script>...</script>的省略号内容

l handle_comment(data) ,处理注释,<!-- -->之间的文本

l reset():将实例重置,包括作为参数输入的数据进行清空。

二、基本使用

from html.parser import HTMLParserclass MyHTMLParser(HTMLParser):def handle_starttag(self, tag, attrs):"""recognize start tag, like <div>:param tag::param attrs::return:"""print("Encountered a start tag:", tag)def handle_endtag(self, tag):"""recognize end tag, like </div>: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 <img />: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('<html><head><title>Test</title></head>''<body><h1>Parse me!</h1><img src = "" />''<!-- comment --></body></html>')

以上是根据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如下

<html><head><title>Test</title></head><body><h1>Parse me!</h1><img src = "" /><p class='123'>A paragraph.</p><p class = "p_font">A paragraph with class.</p><!-- comment --><div><p>A paragraph in div.</p></div></body>
</html>

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 = Falsedef handle_starttag(self, tag, attrs):
for attr in attrs:
if tag == 'p' and attr[1]=='"p_font":
self.flag = Truedef 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 = Falsedef handle_starttag(self, tag, attrs):if tag == 'div':self.in_div = Truedef 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 = '''<h3 class="tb-main-title" data-title="Xiaomi/小米">【金冠现货/全色/顶配版】Xiaomi/小米 小米note移动联通4G手机</h3><p class="tb-subtitle">【购机即送布丁套+高清贴膜+线控耳机+剪卡器+电影支架等等,套餐更多豪礼更优惠】</p><div id="J_TEditItem" class="tb-editor-menu"></div></div>
<h3 class="tb-main-title" data-title="MIUI/小米">【现货增强/标准】MIUI/小米 红米手机2红米2移动联通电信4G双卡</h3><p class="tb-subtitle">[红米手机2代颜色版本较多,请亲们阅读购买说明按需选购---感谢光临]<div id="J_TEditItem" class="tb-editor-menu"></div></div>'''

很明显,这里面包含了两台手机,我们的目标是提取两个手机的名字出来。

由于当我们feed这个html到HTMLParser中后,他们所有的标签都迭代,如果需要它只提取我们需要的数据时,我们需要设置当handle_starttag遇到那个标签和属性时,才调用handle_data并print出我们的结果,这个时候我们可以使用一个flag作为判定,代码如下:

#定义一个MyParser继承自HTMLParser
class MyParser(HTMLParser):re=[]#放置结果flag=0#标志,用以标记是否找到我们需要的标签def handle_starttag(self, tag, attrs):if tag=='p':#目标标签for attr in attrs:if attr[0]=='class' and attr[1]=='tb-subtitle':#目标标签具有的属性self.flag=1#符合条件则将标志设置为1breakelse:passdef handle_data(self, data):if self.flag==1:self.re.append(data.strip())#如果标志为我们设置的,则将数据添加到列表中self.flag=0#重置标志,进行下次迭代else:passmy=MyParser()
my.feed(html)
my.re

运行结果如下,达到了我们的预期:

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

'[红米手机2代颜色版本较多,请亲们阅读购买说明按需选购---感谢光临]']

转载于:https://www.cnblogs.com/pinpin/p/10436290.html

python模块之HTMLParser简介相关推荐

  1. python的html模块,python模块之HTMLParser

    HTMLParser是python用来解析html的模块.它可以分析出html里面的标签.数据等等,是一种处理html的简便途径. HTMLParser采用的是一种事件驱动的模式,当HTMLParse ...

  2. python模块之HTMLParser之穆雪峰的案例(理解其用法原理)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser之穆雪峰的案例(理解其用法原理) #http://www.cnblog ...

  3. python中html.parser_python模块之HTMLParser简介

    html.parser是一个非常简单和实用的库,它的核心是HTMLParser类. 工作的流程是:当你feed给它一个类似HTML格式的字符串时,它会调用goahead方法向前迭代各个标签,并调用对应 ...

  4. python模块学习---HTMLParser(解析HTML文档元素)

    HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析. 本文主要简单讲一下HTMLParser的用法. 使用时需要定义一个从类HTMLParser继承的类,重定义 ...

  5. python解析html用哪个模块_[转载]python模块学习---HTMLParser(解析HTML文档元素)

    HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析. 本文主要简单讲一下HTMLParser的用法. 使用时需要定义一个从类HTMLParser继承的类,重定义 ...

  6. Python编程语言学习:包导入和模块搜索路径简介、使用方法之详细攻略

    Python编程语言学习:包导入和模块搜索路径简介.使用方法之详细攻略 目录 包导入和模块搜索路径简介 1.Pyhon搜索模块路径的机制 2.自定义配置搜索路径

  7. Python 基金会 —— 模块和包简介

    一.模块(Module) 1.模块的作用      在交互模式下输出的变量和函数定义,一旦终端重新启动后,这些定义就都不存在了,为了持久保存这些变量.函数等的定义,Python中引入了模块(Modul ...

  8. Python各类库的简介(转)

    转的一篇,整理的很全了,转需及自用 原文:https://blog.csdn.net/weixin_42209553/article/details/84074840 正文: 格式:库,名称,简介 C ...

  9. 在Ubuntu 14.04.5 LTS上安装python模块selenium 3实录

    简介 Selenium是python模块库中一组web自动化测试工具集,提供多种语言的API,例如java,python,ruby,.net等,支持Firefox,Chrome,IE,Safari 等 ...

最新文章

  1. Git 提交代码之后的几种后悔药
  2. 浅谈零样本网络表示学习
  3. python小学生口算题生成器_小学数学题出题神器
  4. 四、纤维素纤维使用P-N系阻燃剂协同作用的原理?
  5. 老板说,我请你来,不是叫你无脑拷贝的,竟然在线上搞出这么大的一个BUG......
  6. python学习day_04_字典
  7. c语言 指针 地址溢出,堆栈溢出,指针在C中
  8. API开发手册在线中文版
  9. C# 自定义鼠标光标
  10. 苏州园林年卡 办理与使用 附 苏州园林门票价格
  11. 在网页中显示PPT、Word、Excel
  12. 机器视觉——旋转中心的标定
  13. 我研究我自己!苏炳添博士重磅论文:我怎么跑这么快?
  14. 通量数据处理(Python)——NC格式转为CSV格式
  15. 一、Unity环境安装
  16. 笔记本电脑降级安装WinXP的总结
  17. Android反编译工具jadx详细使用方法
  18. IKNP 的改进:G-OT、C-OT、R-OT
  19. CRUD就是技术开发的while(1),干掉它你才能升职加薪
  20. “好不容易进的腾讯,你凭什么要离开?”

热门文章

  1. format()用法
  2. 算法题 递增的三元子序列
  3. uniq命令注意事项,检查重复行的时候,只会检查相邻的行。
  4. GNU Linux shell中如何进行各进制编码间(二进制、8进制、16进制、base64)的转换
  5. 爱心网页浪漫,博主司机搞事情啦,附百度网盘源码自取哦
  6. Good Luck!(kmp算法)
  7. 《中国哲学史大纲》读书笔记
  8. sgbm算法_关于双目立体视觉的三大基本算法及发展现状的总结
  9. alter标签的使用
  10. Gearbox变速器