您的位置:首页 > 编程语言 > Python开发

Python中使用HTMLParser解析HTML文档

2016-07-21 22:37 771 查看
HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析,是一个处理HTML的简便途径。

使用时需要定义一个继承HTMLParser的类,并重定义需要的成员函数以实现需要功能。

HTMLParser实例中几个常用方法:

#为解析器提供一些数据,数据格式必须是str
HTMLParser.feed(data)

#重置实例
HTMLParser.reset()

#处理开始标签 如:<div id="main"> 其中参数对应信息为handle_starttag('id', [('id', 'main')])
HTMLParser.handle_starttag(tag, attrs)

#处理结束标签 如:</div>
HTMLParser.handle_endtag(tag)

#处理开始标签和结束标签
HTMLParser.handle_startendtag(tag, attrs)

#处理一对闭合标签内的text数据 如:<td>G123</td>中的G123
HTMLParser.handle_data(data)

#处理文档中的注释 如: <!--comment-->
HTMLParser.handle_comment(data)

#处理文档声明信息 如:<!DOCTYPE html>
HTMLParser.handle_decl(decl)
其中,tag是的html标签名,attrs是 元素为(属性,值)元组(tuple)的列表(list),data是字符串(str)。

HTMLParser自动将tag和attrs都转为小写。

下面以http://qq.ip138.com/train/anhui/HeFei.htm页面的数据为例,解析其中的车次信息,页面信息如下图:



具体程序:

#encoding:utf-8
'''
Created on 2016年7月21日
python version 3.5
@author: baalhuo
'''

from html.parser import HTMLParser
import urllib.request
import re

liststr = list()	#创建list存放车次信息

class MyHTMLParser(HTMLParser):
tempstr=str()
def handle_starttag(self, tag, attrs):
if tag=='tr':
self.tempstr=''

def handle_endtag(self, tag):
if tag=='tr':
#匹配列车类型 过滤无用的tr标签
matchObj = re.match( r'G|D|K|T|Z|\d', self.tempstr)
if matchObj:
liststr.append(self.tempstr)

def handle_data(self, data):
if(data.isspace()==False):
self.tempstr+=data+'\t'

url = 'http://qq.ip138.com/train/anhui/HeFei.htm'
data = urllib.request.urlopen(url).read()
data = data.decode('gb2312') #根据抓取页面设置数据编码
par = MyHTMLParser()
par.feed(data)
for value in liststr:
print(value)
print(liststr.__len__())
结果输出:

1151/1154	普快	杭州	12:40	合肥	当天18:45	18:57	西安	10:42
1152/1153	普快	西安	13:23	合肥	第2日04:59	05:15	杭州	11:19
2275/2278	普快	郑州	23:52	合肥	第2日07:55	08:08	杭州	14:06
2276/2277	普快	杭州	15:31	合肥	当天21:42	21:58	郑州	07:54
G1271/G1274	高速动车	武汉	07:51	合肥	当天10:24	10:44	沈阳北	18:59
G1272/G1273	高速动车	沈阳北	07:39	合肥	当天16:21	16:38	武汉	19:06
G257/G260	高速动车	青岛	15:19	合肥	当天20:39	20:55	武汉	23:12
......
......
T64	空调特快	合肥	18:40	合肥	当天18:40	18:40	北京	05:56
Z225/Z228	直达特快	北京	21:50	合肥	第2日07:32	07:32	合肥	07:32
Z226/Z227	直达特快	合肥	21:50	合肥	当天21:50	21:50	北京	07:40
187

更多HTMLParser方法请参考官方文档

3.5https://docs.python.org/3/library/html.parser.html

2.7https://docs.python.org/2/library/htmlparser.html

学之,以记之。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: