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群发邮件实例代码
Jan 03 Python
python中readline判断文件读取结束的方法
Nov 08 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 Python
django1.11.1 models 数据库同步方法
May 30 Python
Python玩转Excel的读写改实例
Feb 22 Python
python与字符编码问题
May 24 Python
Python 获取numpy.array索引值的实例
Dec 06 Python
Python开发之基于模板匹配的信用卡数字识别功能
Jan 13 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
python面向对象版学生信息管理系统
Jun 24 Python
利用Python将list列表写入文件并读取的方法汇总
Mar 25 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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下统计用户在线时间的一种尝试
2010/08/26 PHP
PHP计划任务、定时执行任务的实现代码
2011/04/23 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
JS验证字符串功能
2017/02/22 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
Python多线程编程(五):死锁的形成
2015/04/05 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
Python中%r和%s的详解及区别
2017/03/16 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
Python中的asyncio代码详解
2019/06/10 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
python学生信息管理系统实现代码
2019/12/17 Python
Python class的继承方法代码实例
2020/02/14 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
面试求职的个人自我评价
2013/11/16 职场文书
优秀公益广告词大全
2014/03/19 职场文书
产品包装策划方案
2014/05/18 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
见习报告格式要求
2014/11/04 职场文书
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA