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 mysqldb连接数据库
Mar 16 Python
Python实现数通设备端口使用情况监控实例
Jul 15 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
Jun 19 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
python实现翻转棋游戏(othello)
Jul 29 Python
Python面向对象封装操作案例详解
Dec 31 Python
Python正则表达式学习小例子
Mar 03 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
Python yield生成器和return对比代码实例
Apr 20 Python
python dict如何定义
Sep 02 Python
如何用Python提取10000份log中的产品信息
Jan 14 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 中关于ord($str)&amp;gt;0x80的详细说明
2012/09/23 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
xml转json的js代码
2012/08/28 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
JavaScript手机振动API
2016/06/11 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
JavaScript实现修改伪类样式
2017/11/27 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
vue实现计算器功能
2020/02/22 Javascript
python中使用PIL制作并验证图片验证码
2018/03/15 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
Django 路由控制的实现
2019/07/17 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
Python 存取npy格式数据实例
2020/07/01 Python
python 安装移动复制第三方库操作
2020/07/13 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
自考毕业生自我鉴定
2013/11/04 职场文书
校庆接待方案
2014/03/18 职场文书
生物学专业求职信
2014/07/23 职场文书
公证委托书
2014/08/01 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL
Hive HQL支持2种查询语句风格
2022/06/25 数据库