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 相关文章推荐
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
Python中表示字符串的三种方法
Sep 06 Python
一个Python最简单的接口自动化框架
Jan 02 Python
使用pandas read_table读取csv文件的方法
Jul 04 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
python 实现线程之间的通信示例
Feb 14 Python
一文了解python 3 字符串格式化 F-string 用法
Mar 04 Python
Python openpyxl 插入折线图实例
Apr 17 Python
Python3获取cookie常用三种方案
Oct 05 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
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
2015/06/09 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
js常用DOM方法详解
2017/02/04 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
Python内置random模块生成随机数的方法
2019/05/31 Python
python实现随机加减法生成器
2020/02/24 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
html5 外链式实现加减乘除的代码
2019/09/04 HTML / CSS
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
J2EE面试题
2016/03/14 面试题
大学应届生求职简历的自我评价
2013/10/08 职场文书
《春笋》教学反思
2014/04/15 职场文书
物流管理专业求职信
2014/05/29 职场文书
食堂标语大全
2014/06/11 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
区域经理岗位职责
2015/02/02 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS