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 相关文章推荐
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
Python随机读取文件实现实例
May 25 Python
python版学生管理系统
Jan 10 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
python之拟合的实现
Jul 19 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
python烟花效果的代码实例
Feb 25 Python
Django如何创作一个简单的最小程序
May 12 Python
关于python中模块和重载的问题
Nov 02 Python
尝试使用Python爬取城市租房信息
Apr 12 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 email邮箱正则
2008/10/08 PHP
PHP 输出简单动态WAP页面
2009/06/09 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
PHP实现文件上传与下载
2020/08/28 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
List the Codec Files on a Computer
2007/06/18 Javascript
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
2016/12/16 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
Vue.js实现备忘录功能
2019/06/26 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
python中list常用操作实例详解
2015/06/03 Python
python中的set实现不重复的排序原理
2018/01/24 Python
Python测试模块doctest使用解析
2019/08/10 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
实习单位推荐信范文
2013/11/27 职场文书
离婚案件答辩状
2015/05/22 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python