Python中使用HTMLParser解析HTML文檔

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


學之,以記之。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章