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 random模块常用方法
Nov 03 Python
对Python正则匹配IP、Url、Mail的方法详解
Dec 25 Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
django 简单实现登录验证给你
Nov 06 Python
Pytorch模型转onnx模型实例
Jan 15 Python
解决TensorFlow模型恢复报错的问题
Feb 06 Python
基于python3的socket聊天编程
Feb 17 Python
python实时监控logstash日志代码
Apr 27 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
推荐值得学习的12款python-web开发框架
Aug 10 Python
详解Pytorch显存动态分配规律探索
Nov 17 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
ftp类(myftp.php)
2006/10/09 PHP
解析php类的注册与自动加载
2013/07/05 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
Prototype Selector对象学习
2009/07/23 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
JavaScript里实用的原生API汇总
2015/05/14 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
js 闭包深入理解与实例分析
2020/03/19 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
一些常用的Python爬虫技巧汇总
2016/09/28 Python
Python 列表理解及使用方法
2017/10/27 Python
带你认识Django
2019/01/15 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
50岁生日感言
2014/01/23 职场文书
商场活动策划方案
2014/01/24 职场文书
同事吵架检讨书
2014/02/05 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
小学生寒假家长评语
2014/04/16 职场文书
推广普通话演讲稿
2014/05/23 职场文书
2014年车间主任工作总结
2014/12/10 职场文书