Python—解析HTML頁面(HTMLParser)


HTMLParser類的定義及常用方法

類的定義

  • HTMLParser主要是用來解析HTML文件(包括HTML中無效的標記)。
  • 參數convert_charrefs表示是否將所有的字符引用自動轉化為Unicode形式,Python3.5以后默認是True。
  • HTMLParser可以接收相應的HTML內容,並進行解析,遇到HTML的標簽會自動調用相應的handler(處理方法)來處理,用戶需要自己創建相應的子類來繼承HTMLParser,並且復寫相應的handler方法。
  • HTMLParser不會檢查開始標簽和結束標簽是否是一對。

常用方法

  • HTMLParser.feed(data):接收一個字符串類型的HTML內容,並進行解析。
  • HTMLParser.close():當遇到文件結束標簽后進行的處理方法。如果子類要復寫該方法,需要首先調用HTMLParser累的close()。
  • HTMLParser.reset():重置HTMLParser實例,該方法會丟掉未處理的html內容。
  • HTMLParser.getpos():返回當前行和相應的偏移量。
  • HTMLParser.handle_starttag(tag, attrs):對開始標簽的處理方法。例如<div id="main">,參數tag指的是div,attrs指的是一個(name,Value)的列表,即列表里面裝的數據是元組。
  • HTMLParser.handle_endtag(tag):對結束標簽的處理方法。例如</div>,參數tag指的是div。
  • HTMLParser.handle_startendtag(tag, attrs):識別沒有結束標簽的HTML標簽,例如<img />等。
  • HTMLParser.handle_data(data):對標簽之間的數據的處理方法。<tag>test</tag>,data指的是“test”。
  • HTMLParser.handle_comment(data):對HTML中注釋的處理方法。

解釋部分:

  • tag表示的是html標簽,attrs是一個列表,列表元素為一個個“(屬性,值)”形式的元組。 
  • HTMLParser會自動將tag和attrs都轉為小寫。

實例應用

try:
    from HTMLParser import HTMLParser
except:
    from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.data = []   # 定義data數組用來存儲html中的數據
        self.links = []  
           
    def handle_starttag(self, tag, attrs):
        print('<%s>' % tag) 
        if tag == "a":
            if len(attrs) == 0: pass
            else:
                for (variable, value)  in attrs:
                    if variable == "href":
                        self.links.append(value)
    
    def handle_endtag(self, tag):
        print('</%s>' % tag)

    def handle_startendtag(self, tag, attrs):
        print('<%s/>' % tag)

    def handle_data(self, data):
        print('data===>', data)

    def handle_comment(self, data):
        print('<!--', data, '-->')

    def handle_entityref(self, name):
        print('&%s;' % name)

    def handle_charref(self, name):
        print('&#%s;' % name)
        
if __name__ == "__main__":
    html_code = '''<html>
			<head>這是頭標簽</head>
			<body>
			    <!-- test html parser -->
			    <p>Some <a href=\"#\">html</a> HTML&nbsp;&#1234; Ӓtutorial...<br>END</p>
			</body></html>'''
    parser = MyHTMLParser()
    parser.feed(html_code)
    parser.close()
    print(parser.data)
    print(parser.links)

處理HTML轉義字符

在 HTML 中 <、>、& 等字符有特殊含義(<,> 用於標簽中,& 用於轉義),他們不能在 HTML 代碼中直接使用,如果要在網頁中顯示這些符號,就需要使用 HTML 的轉義字符串(Escape Sequence),例如 < 的轉義字符是 <,瀏覽器渲染 HTML 頁面時,會自動把轉移字符串換成真實字符。

轉義字符(Escape Sequence)由三部分組成:第一部分是一個 & 符號,第二部分是實體(Entity)名字,第三部分是一個分號。 比如,要顯示小於號(<),就可以寫 &lt;。

html = '&lt;abc&gt;'

# 反轉義:方式1
try:
    from HTMLParser import HTMLParser
except:
    from html.parser import HTMLParser
html_parser = HTMLParser()
text = html_parser.unescape(html)
print(text)

# 反轉義:方式2
import html
text = html.unescape('a=1&b=2')
print(text)

# 轉義
import cgi
html = cgi.escape(text)
print(html)

https://www.liaoxuefeng.com/wiki/897692888725344/966401234683424 

https://www.liaoxuefeng.com/wiki/1016959663602400/1017784593019776

https://baijiahao.baidu.com/s?id=1637614366297669334&wfr=spider&for=pc


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM