HTMLParser で HTML を処理する
Python に標準搭載されている HTML パーサである html.parser.HTMLParser は、イベントドリブンな HTML パーサです。
HTMLParser
クラスを継承して独自のパーサを作成し、feed
メソッドに HTML テキストを渡すことによってパースを開始します。
下記のサンプルコードでは、開始タグ、終了タグ、テキストデータ、コメントが見つかったときに、それぞれ内容を出力しています。
from html.parser import HTMLParser
# HTMLParser を継承してパーサクラスを作成する
class MyParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print("START :", tag, attrs)
def handle_endtag(self, tag):
print("END :", tag)
def handle_data(self, data):
print("DATA :", data)
def handle_comment(self, comment):
print("COMMENT:", comment)
# パーサのインスタンスを生成してパースを実行
parser = MyParser()
parser.feed('<html><body>'
'<div class="class1" id="id1">Hello World</div>'
'<!-- I am a comment -->'
'</body></html>')
START : html []
START : body []
START : div [('class', 'class1'), ('id', 'id1')]
DATA : Hello World
END : div
COMMENT: I am a comment
END : body
END : html
HTMLParser
は、単純に HTML 要素を前から順番に処理していくだけなので、現在の要素がどのようなコンテキストで記述されているかは、パーサクラス内で判断していくように実装する必要があります。
ローカルの HTML ファイル、Web 上の HTML ファイルを扱う場合
ローカルファイルの内容は、Python 標準の open
関数で読み込むことができます。
text = open('input.html').read()
Web 上の HTML ファイルの内容も、requests
モジュールなどで簡単に読み込めます。
import requests
text = requests.get('http://example.com/').text
あとは、取得した HTML テキストを HTMLParser#feed()
に渡してやれば OK です。