Python 標準ライブラリの html.parser モジュールで利用できる HTMLParser インスタンスは、HTML データが入力されると、開始タグ、終了タグ、およびその他の要素が見つかる度にハンドラーメソッドを呼び出します。各メソッドの挙動を実装するには HTMLParser サブクラスを使ってそれぞれを上書きして行います。
Python ドキュメント [1] より引用
Web 上の操作を自動化したいとき、PySide6 の QWebEnginePage クラス [2] のインスタンスに対象 URL を表示して、JavaScript で操作することが多いのですが、単純に特定の情報を抽出したいときは、本体の Python プログラムとのやりとりを面倒に感じています。
Python の標準ライブラリに HTML/XHTML のパーサがあるので使ってみたところ、自分にとっては使い勝手が良かったので、備忘録としてサンプルを掲載しました。
下記の OS 環境で動作確認をしています。
![]() |
RHEL 9.4 | x86_64 |
Python | 3.12.1 |
HTMLParser を使ったサンプルを下記に示しました。このサンプルは、Python ドキュメント [1] に掲載されているサンプルを少し改変したものです。
test_html_parser.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from html.parser import HTMLParser | |
class MyHTMLParser(HTMLParser): | |
def handle_starttag(self, tag, attrs): | |
dict_attrs = dict(attrs) | |
print("タグのはじめ :", tag) | |
if len(dict_attrs) > 0: | |
print(" └ タグの属性 =", dict_attrs) | |
def handle_endtag(self, tag): | |
print("タグのおわり :", tag) | |
def handle_data(self, data): | |
print("タグ内の文字列 :", data.strip()) | |
if __name__ == '__main__': | |
parser = MyHTMLParser() | |
parser.feed( | |
'<html><head><title>テスト(タイトル)</title></head>' | |
'<body><h1 id="title">ページタイトル</h1>' | |
'<p style="font-family: monospace;">これはテスト用です。</p>' | |
'</body></html>' | |
) |
3つのメソッド handle_starttag、handle_endtag、handle_data は、継承している HTMLParser クラスのメソッドをオーバーライドしています。
以下が実行例です。
タグのはじめ : html タグのはじめ : head タグのはじめ : title タグ内の文字列 : テスト(タイトル) タグのおわり : title タグのおわり : head タグのはじめ : body タグのはじめ : h1 └ タグの属性 = {'id': 'title'} タグ内の文字列 : ページタイトル タグのおわり : h1 タグのはじめ : p └ タグの属性 = {'style': 'font-family: monospace;'} タグ内の文字列 : これはテスト用です。 タグのおわり : p タグのおわり : body タグのおわり : html
実用的には、抽出したい対象のタグを見つけたらフラグを立てて (handle_starttag)、収集したい文字列を変数に保持して (handle_data)、そのタグが閉じたらフラグを落とす (handle_endtag)、といった処理を加えます。
参考サイト
- html.parser --- Simple HTML and XHTML parser
- QWebEngineView - Qt for Python
- Beautiful Soup Documentation
- はじめから BeautifulSoup を利用した方が良かったかもしれません。

にほんブログ村
#オープンソース

0 件のコメント:
コメントを投稿