Python HTML操做(HTMLParser)

HTML操做是編程中很重要的一塊,下面用Python3.x中的html.parser中的HTMLParser類來進行HTML的解析。html

HTMLParser類定義及經常使用方法

  • 標準庫中的定義

class html.parser.HTMLParser(*, convert_charrefs=True)
    1. HTMLParser主要是用來解析HTML文件(包括HTML中無效的標記)
    2. 參數convert_charrefs表示是否將全部的字符引用自動轉化爲Unicode形式,Python3.5之後默認是True
    3. HTMLParser能夠接收相應的HTML內容,並進行解析,遇到HTML的標籤會自動調用相應的handler(處理方法)來處理,用戶須要本身建立相應的子類來繼承HTMLParser,而且複寫相應的handler方法
    4. HTMLParser不會檢查開始標籤和結束標籤是不是一對
  • 經常使用方法

    1. HTMLParser.feed(data):接收一個字符串類型的HTML內容,並進行解析
    2. HTMLParser.close():當遇到文件結束標籤後進行的處理方法。若是子類要複寫該方法,須要首先調用HTMLParser累的close()
    3. HTMLParser.reset():重置HTMLParser實例,該方法會丟掉未處理的html內容
    4. HTMLParser.getpos():返回當前行和相應的偏移量
    5. HTMLParser.handle_starttag(tagattrs):對開始標籤的處理方法。例如<div id="main">,參數tag指的是div,attrs指的是一個(name,Value)的列表
    6. HTMLParser.handle_endtag(tag):對結束標籤的處理方法。例如</div>,參數tag指的是div
    7. HTMLParser.handle_data(data):對標籤之間的數據的處理方法。<tag>test</tag>,data指的是「test」
    8. HTMLParser.handle_comment(data):對HTML中註釋的處理方法。

實例應用

  • 待處理文件: http://files.cnblogs.com/files/AlwinXu/Scan_TFS.zip
  • 代碼
__author__ = 'xua'

import json

#For python 3.x
from html.parser import HTMLParser

#定義HTMLParser的子類,用以複寫HTMLParser中的方法
class MyHTMLParser(HTMLParser):

    #構造方法,定義data數組用來存儲html中的數據
    def __init__(self):
        HTMLParser.__init__(self)
        self.data = []

    #覆蓋starttag方法,能夠進行一些打印操做
    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數據,這裏保存在data數組
    def handle_data(self, data):
        if data.count('\n') == 0:
            self.data.append(data)


#讀取本地html文件.(固然也能夠用urllib.request中的urlopen來打開網頁數據並讀取,這裏不作介紹)
htmlFile = open(r"/Users/xualvin/Downloads/TFS.htm",'r')
content = htmlFile.read()

#建立子類實例
parser = MyHTMLParser()

#將html數據傳給解析器進行解析
parser.feed(content)

#對解析後的數據進行相應操做並打印
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])
  • 輸出結果

相關文章
相關標籤/搜索