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的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
python爬虫基本知识
Mar 05 Python
Python实现确认字符串是否包含指定字符串的实例
May 02 Python
一百多行python代码实现抢票助手
Sep 25 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
Python urllib.request对象案例解析
May 11 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
python中__slots__节约内存的具体做法
Jul 04 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
JavaScript事件对象深入详解
2018/12/30 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
python实现的多线程端口扫描功能示例
2017/01/21 Python
Python冲顶大会 快来答题!
2018/01/17 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
Form表单及django的form表单的补充
2019/07/25 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
家居饰品店创业计划书
2014/01/31 职场文书
《雾凇》教学反思
2014/02/17 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
Python答题卡识别并给出分数的实现代码
2021/06/22 Python
5行Python代码实现一键批量扣图
2021/06/29 Python
python的变量和简单数字类型详解
2021/09/15 Python
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
MySQL创建管理LIST分区
2022/04/13 MySQL