2024-05-21

【備忘録】HTMLParser の使い方

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
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_starttaghandle_endtaghandle_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)、といった処理を加えます。

参考サイト

  1. html.parser --- Simple HTML and XHTML parser
  2. QWebEngineView - Qt for Python
  3. Beautiful Soup Documentation
    • はじめから BeautifulSoup を利用した方が良かったかもしれません。

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



0 件のコメント: