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实现批量重命名文件的代码
May 25 Python
简单谈谈Python中函数的可变参数
Sep 02 Python
python音频处理用到的操作的示例代码
Oct 27 Python
pandas中去除指定字符的实例
May 18 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
Pycharm以root权限运行脚本的方法
Jan 19 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Keras中的多分类损失函数用法categorical_crossentropy
Jun 11 Python
Python requests上传文件实现步骤
Sep 15 Python
python字典按照value排序方法
Dec 28 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 Python
Pytorch 如何实现常用正则化
May 27 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基于文件存储实现缓存的方法
2015/07/20 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
解决vue-cli项目打包出现空白页和路径错误的问题
2018/09/04 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
深入解答关于Python的11道基本面试题
2017/04/01 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
利用Python检测URL状态
2019/07/31 Python
python如何基于redis实现ip代理池
2020/01/17 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
上海期货面试题
2014/01/31 面试题
区域销售经理职责
2013/12/22 职场文书
一份报关员的职业规划范文
2014/01/08 职场文书
幼儿园教研活动方案
2014/01/19 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
导游个人求职信范文
2014/03/23 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL