python3 解析html_Python3.x网页抓取HTMLParser
HTML操作是編程中很重要的一塊,下面用Python3.x中的html.parser中的HTMLParser類來進(jìn)行HTML的解析。
HTMLParser類定義及常用方法
標(biāo)準(zhǔn)庫中的定義
class html.parser.HTMLParser(*, convert_charrefs=True)
HTMLParser主要是用來解析HTML文件(包括HTML中無效的標(biāo)記)
參數(shù)convert_charrefs表示是否將所有的字符引用自動(dòng)轉(zhuǎn)化為Unicode形式,Python3.5以后默認(rèn)是True
HTMLParser可以接收相應(yīng)的HTML內(nèi)容,并進(jìn)行解析,遇到HTML的標(biāo)簽會(huì)自動(dòng)調(diào)用相應(yīng)的handler(處理方法)來處理,用戶需要自己創(chuàng)建相應(yīng)的子類來繼承HTMLParser,并且復(fù)寫相應(yīng)的handler方法
HTMLParser不會(huì)檢查開始標(biāo)簽和結(jié)束標(biāo)簽是否是一對
常用方法
HTMLParser.feed(data):接收一個(gè)字符串類型的HTML內(nèi)容,并進(jìn)行解析
HTMLParser.close():當(dāng)遇到文件結(jié)束標(biāo)簽后進(jìn)行的處理方法。如果子類要復(fù)寫該方法,需要首先調(diào)用HTMLParser累的close()
HTMLParser.reset():重置HTMLParser實(shí)例,該方法會(huì)丟掉未處理的html內(nèi)容
HTMLParser.getpos():返回當(dāng)前行和相應(yīng)的偏移量
HTMLParser.handle_starttag(tag,?attrs):對開始標(biāo)簽的處理方法。例如
,參數(shù)tag指的是div,attrs指的是一個(gè)(name,Value)的列表HTMLParser.handle_endtag(tag):對結(jié)束標(biāo)簽的處理方法。例如
,參數(shù)tag指的是divHTMLParser.handle_data(data):對標(biāo)簽之間的數(shù)據(jù)的處理方法。test,data指的是“test”
HTMLParser.handle_comment(data):對HTML中注釋的處理方法。
實(shí)例
import json
#For python 3.x
from html.parser import HTMLParser
#定義HTMLParser的子類,用以復(fù)寫HTMLParser中的方法
class MyHTMLParser(HTMLParser):
#構(gòu)造方法,定義data數(shù)組用來存儲(chǔ)html中的數(shù)據(jù)
def __init__(self):
HTMLParser.__init__(self)
self.data = []
#覆蓋starttag方法,可以進(jìn)行一些打印操作
def handle_starttag(self, tag, attrs):
pass
#print("Start Tag: ",tag)
#for attr in attrs:
# print(attr)
#覆蓋endtag方法
def handle_endtag(self, tag):
pass
#覆蓋handle_data方法,用來處理獲取的html數(shù)據(jù),這里保存在data數(shù)組
def handle_data(self, data):
if data.count('\n') == 0:
self.data.append(data)
#讀取本地html文件.(當(dāng)然也可以用urllib.request中的urlopen來打開網(wǎng)頁數(shù)據(jù)并讀取,這里不做介紹)
htmlFile = open(r"/Users/xualvin/Downloads/TFS.htm",'r')
content = htmlFile.read()
#創(chuàng)建子類實(shí)例
parser = MyHTMLParser()
#將html數(shù)據(jù)傳給解析器進(jìn)行解析
parser.feed(content)
#對解析后的數(shù)據(jù)進(jìn)行相應(yīng)操作并打印
for item in parser.data:
if item.startswith("{\"columns\""):
payloadDict = json.loads(item)
list = payloadDict["payload"]["rows"]
for backlog in list:
if backlog[1] == "Product Backlog Item" or backlog[1] == "Bug":
print(backlog[2]," Point: ",backlog[3])
當(dāng)然了,使用Python自帶的HTMLParser還是比較麻煩的,需要手寫處理Html標(biāo)簽的函數(shù)。
建議使用Beautiful Soup,使用方法,猛戳這里!
總結(jié)
以上是生活随笔為你收集整理的python3 解析html_Python3.x网页抓取HTMLParser的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python上传图片到服务器_Flask
- 下一篇: pythondifflib详解_用pyt