Python 利用 HTMLParser 清理 HTML 標籤

Posted on  Apr 25, 2020  in  Python 程式設計 - 中階  by  Amo Chen  ‐ 2 min read

清理網頁資料時,最常見的需求就是將網頁中的 HTML 標籤去除。

通常我們會直覺想到用正規表示式(regular expression)直接將 HTML 的標籤取代為空字串。

不過 Python 還提供另一種方便的方式可以透過內建模組 HTMLParser 達成。

本文環境

  • Python 3.6.5

HTMLParser

HTMLParser 是 Python 提供的內建類別(Class),讓我們可以針對 HTML 或者 XHTML 進行簡單的文字爬梳(Parse)。

官方文件提供的範例說明得很清楚,使用方法就是繼承 HTMLParser ,然後依照需求改寫需要實作的方法,例如以下的範例,可以將 <標籤> 以及 </標籤> 中的標籤獨立列印一行,以及將 <標籤>資料</標籤> 中的資料列印出來:

from html.parser import HTMLParser


class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("遇到 HTML 標籤開始:", tag)

    def handle_endtag(self, tag):
        print("遇到 HTML 標籤結束:", tag)

    def handle_data(self, data):
        print("遇到 HTML 標籤內的資料:", data)


parser = MyHTMLParser()
parser.feed(
    '<html><head><title>Test</title></head>'
    '<body><h1>Parse me!</h1></body></html>'
)

上述範例的執行結果:

遇到 HTML 標籤開始: html
遇到 HTML 標籤開始: head
遇到 HTML 標籤開始: title
遇到 HTML 標籤內的資料: Test
遇到 HTML 標籤結束: title
遇到 HTML 標籤結束: head
遇到 HTML 標籤開始: body
遇到 HTML 標籤開始: h1
遇到 HTML 標籤內的資料: Parse me!
遇到 HTML 標籤結束: h1
遇到 HTML 標籤結束: body
遇到 HTML 標籤結束: html

看起來十分簡單吧!

所以按照我們要去掉 HTML 文本(text) 中的標籤的話,只留下純文字的話,切入點就是實作 handle_data 方法,直接看程式:

from html.parser import HTMLParser

class HTMLCleaner(HTMLParser):
    def __init__(self, *args, **kwargs):
        super(HTMLCleaner, self).__init__(*args, **kwargs)
        self.data_list = []
        
    def handle_data(self, data):
        self.data_list.append(data)


cleaner = HTMLCleaner()
cleaner.feed(
    '<html><head><title>Test</title></head>'
    '<body><h1>Parse me!</h1></body></html>'
)
print(cleaner.data_list)

上述程式主要為繼承 HTMLParser 類別,並且在 __init__(self, *args, **kwargs): 中新增 1 個 data_list 屬性的列表供我們存放純文字。

然後在 handle_data(self, data) 每次遇到乾淨的文字時就 append 至 self. data_list 存起來,供我們之後使用。

最後程式執行結果,可以看到我們輕鬆地將含有 HTML 標籤的文字去掉 HTML 標籤:

['Test', 'Parse me!']

以上就是利用 Python 內建模組進行 HTML 文本清理的方法!

Happy Coding!

References

https://docs.python.org/3.6/library/html.parser.html

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!