Python中使用HTMLParser解析html实例


Posted in Python onFebruary 08, 2015

前几天遇到一个问题,需要把网页中的一部分内容挑出来,于是找到了urllib和HTMLParser两个库.urllib可以将网页爬下来,然后交由HTMLParser解析,初次使用这个库,在查官方文档时也遇到了一些问题,在这里写下来与大家分享.

一个例子

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

  def handle_starttag(self, tag, attrs):

    print "a start tag:",tag,self.getpos()

parser=MyHTMLParser()

parser.feed('<div><p>"hello"</p></div>')

这个例子里HTMLParser是基类,重载了他的handle_starttag方法,输出了一些信息.parser是MyHTMLParser的实例,调用feed方法开始解析函数.值得注意的是,不需要显示调用handle_starttag方法就会执行.

HTMLParser方法的调用方式困惑了我很长时间,看了很多博文才恍然大悟,HTMLParser含有的方法分为两类,一类是需要显式调用的,而另一类不需显示调用.

不需显式调用的方法

下面的这些函数在解析的过程中会触发,但是默认情况下不会产生任何副作用,因而我们要根据自己的需求重载.

1.HTMLParser.handle_starttag(tag,attrs): 解析时遇到开始标签调用,如<p class='para'>,参数tag是标签名,这里是'p',attrs为标签所有属性(name,value)列表,这里是[('class','para')]

2.HTMLParser.handle_endtag(tag): 遇到结束标签时调用,tag是标签名

3.HTMLPars.handle_data(data): 遇到标签中间的内容时调用,如<style> p {color: blue; }</style>,参数data为开闭标签间的内容.值得注意的是在形如<div><p>...</p></div>的位置,并不会在div处调用,而是只在p处调用

当然还有其他函数,这里不做介绍

显式调用的方法

1.HTMLParser.feed(data): 参数为需要解析的html字符串,调用后字符串开始被解析

2.HTMLParser.getpos(): 返回当前的行号和偏移位置,如(23,5)

3.HTMLParser.get_starttag_text(): 返回当前位置最近的开始标签的内容

所有的内容写完了,最后还有一点注意事项,HTMLParser只是一个简单的模块,解析html的功能并不完善,例如不能准确的分别开标签和"自闭标签",看下面代码:

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

  def handle_starttag(self,tag,attrs):

    print 'begin tag',tag

  def handle_startendtag(self,tag,attrs):

    print 'begin end tag',tag
str1='<br>'

str2='<br/>'

parser=MyHTMLParser()
parser.feed(str1)    # 输出 "begin tag br"

parser.feed(str2)    # 输出 "begin end br"
Python 相关文章推荐
浅析Python中的多条件排序实现
Jun 07 Python
python模块之re正则表达式详解
Feb 03 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
Jan 20 Python
python3+PyQt5实现自定义流体混合窗口部件
Apr 24 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
快速排序的四种python实现(推荐)
Apr 03 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
简单了解Django ContentType内置组件
Jul 23 Python
python单例模式的多种实现方法
Jul 26 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
Python类型转换的魔术方法详解
Dec 23 Python
Pyhton中防止SQL注入的方法
Feb 05 #Python
Windows系统下安装Python的SSH模块教程
Feb 05 #Python
Python 冒泡,选择,插入排序使用实例
Feb 05 #Python
Python中使用Flask、MongoDB搭建简易图片服务器
Feb 04 #Python
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 #Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 #Python
Python、Javascript中的闭包比较
Feb 04 #Python
You might like
与数据库连接
2006/10/09 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
python实现问号表达式(?)的方法
2013/11/27 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
Python读取键盘输入的2种方法
2015/06/16 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
简介Django框架中可使用的各类缓存
2015/07/23 Python
Python运算符重载详解及实例代码
2017/03/07 Python
python字符串常用方法
2018/06/14 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
python游戏开发的五个案例分享
2020/03/09 Python
利用python 读写csv文件
2020/09/10 Python
如何用Python绘制3D柱形图
2020/09/16 Python
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
先进事迹演讲稿
2014/09/01 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
档案工作个人总结
2015/03/03 职场文书
自荐信格式范文
2015/03/04 职场文书
Python sklearn分类决策树方法详解
2022/09/23 Python