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