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爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
Python爬虫设置代理IP的方法(爬虫技巧)
Mar 04 Python
用TensorFlow实现多类支持向量机的示例代码
Apr 28 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
python3 线性回归验证方法
Jul 09 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
用 Python 制作地球仪的方法
Apr 24 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
python爬虫用mongodb的理由
Jul 28 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下载CSS文件中的图片的代码
2013/09/24 PHP
laravel学习教程之存取器
2016/07/30 PHP
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
9种python web 程序的部署方式小结
2014/06/30 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
Python编程求质数实例代码
2018/01/31 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
销售心得体会
2014/01/02 职场文书
应聘面试自我评价
2014/01/24 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
人力资源求职信
2014/05/25 职场文书
企业活动策划方案
2014/06/02 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
罚款通知怎么写
2015/04/22 职场文书
小学中队活动总结
2015/05/11 职场文书
如何撰写促销方案?
2019/07/05 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android