HTMLをPythonのhtml.parserで解析する方法

html.parserは、Python標準ライブラリに含まれるHTMLパーサ(HTMLを解析する仕組み)です。HTMLParserクラスを継承し、タグやテキストを受け取るメソッドを書いて使います。

html.parserとは(標準ライブラリのパーサ)

html.parserは、追加インストールなしで使えるPython標準ライブラリのHTML解析モジュールです。

HTMLを先頭から読み、「開始タグを見つけた」などのイベントごとにメソッドを呼び出す方式で動きます。仕様はPython公式ドキュメントで確認できます。

html.parserの使い方 - HTMLParserを継承して書く

HTMLParserを継承したクラスを作り、受け取りたいイベントのメソッドだけを上書きします。

handle_starttag / handle_endtag / handle_dataの役割

handle_starttagは開始タグ(タグ名と属性)、handle_endtagは終了タグ、handle_dataはタグに挟まれたテキストを受け取ります。上書きしなかったイベントは無視されます。

feed()でHTMLを流し込むコード例

次のコードは、HTML内のリンク先(href属性)とテキストを表示する完全な例です。

from html.parser import HTMLParser

class LinkParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if tag == "a":
            print("リンク先:", dict(attrs).get("href"))

    def handle_data(self, data):
        if data.strip():
            print("テキスト:", data.strip())

html = '<ul><li><a href="https://example.com/">公式サイト</a></li></ul>'
parser = LinkParser()
parser.feed(html)

実行すると「リンク先: https://example.com/」「テキスト: 公式サイト」と出力されます。feed()は複数回呼んで、HTMLを分割して流し込むこともできます。

html.parserとBeautifulSoupの使い分け

要素の検索・抽出を手軽にしたいならBeautifulSoup、依存ライブラリを増やしたくない軽い処理ならhtml.parserが向いています。

BeautifulSoupは外部ライブラリ(pip install beautifulsoup4で導入)で、タグ名やCSSセレクタで要素を直接探せます。

BeautifulSoupのパーサにhtml.parserを指定する方法

BeautifulSoupは解析エンジンを選べます。標準のhtml.parserを指定すれば、追加のパーサなしで動きます。

from bs4 import BeautifulSoup

html = '<ul><li><a href="https://example.com/">公式サイト</a></li></ul>'
soup = BeautifulSoup(html, "html.parser")
print(soup.a["href"])

第2引数の"html.parser"がパーサの指定です。lxmlなどを入れていない環境でもそのまま動きます。

HTMLをPythonのhtml.parserで解析する方法に関するよくある質問

html.parserは追加インストールが必要ですか?

不要です。Python本体に付属する標準ライブラリのため、importするだけで使えます。

壊れたHTMLを渡すとエラーになりますか?

多少崩れたHTMLでも例外を出さずに解析を続けます。厳密な文法チェックには向いていません。