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使用三角迭代计算圆周率PI的方法
Mar 20 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
用C++封装MySQL的API的教程
May 06 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
python实现年会抽奖程序
Jan 22 Python
为什么黑客都用python(123个黑客必备的Python工具)
Jan 31 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
sklearn+python:线性回归案例
Feb 24 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 Python
如何用Python提取10000份log中的产品信息
Jan 14 Python
Python 如何安装Selenium
May 06 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
php disk_free_space 返回目录可用空间
2010/05/10 PHP
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
javascript引导程序
2008/10/26 Javascript
javascript 类定义的4种方法
2009/09/12 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
Python如何实现定时器功能
2020/05/28 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
美国温暖商店:The Warming Store
2018/12/15 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
工作态度检讨书
2014/02/11 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
清洁工个人工作总结
2015/03/05 职场文书
公司考勤管理制度
2015/08/04 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL