Python中使用HTMLParser解析HTML文档

HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析,是一个处理HTML的简便途径。

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

HTMLParser实例中几个常用方法:

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

#重置实例
HTMLParser.reset()	

#处理开始标签 如:
其中参数对应信息为handle_starttag('id', [('id', 'main')]) HTMLParser.handle_starttag(tag, attrs) #处理结束标签 如:
HTMLParser.handle_endtag(tag) #处理开始标签和结束标签 HTMLParser.handle_startendtag(tag, attrs) #处理一对闭合标签内的text数据 如:G123中的G123 HTMLParser.handle_data(data) #处理文档中的注释 如: HTMLParser.handle_comment(data) #处理文档声明信息 如: HTMLParser.handle_decl(decl)
其中,tag是的html标签名,attrs是 元素为(属性,值)元组(tuple)的列表(list),data是字符串(str)。

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


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

Python中使用HTMLParser解析HTML文档_第1张图片

具体程序:

#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


学之,以记之。

你可能感兴趣的:(python,HTMLParser,Python)