Categories: Python

【Python】HTMLParserを使ってHTML文字列を解析する方法

この記事では、Python の標準モジュールである html.parserモジュール の HTMLParserクラス を使ってHTML文字列を解析する方法を解説します。

HTMLParserを使うことでタグのタグ名や属性、タグ内の要素を取得することができます。

それでは、HTMLParser の使い方を見ていきましょう!

HTMLParseの使い方

HTML文字列を解析するには、html.parserモジュール の HTMLParserクラス を使うと簡単です。HTMLParserクラス は継承して使用します。

from html.parser import HTMLParser

class MyParser(HTMLParser):
    # 処理

HTMLParserのインスタンスは、HTML文字列が入力されるとタグなどの要素を見つけるたびにハンドラーメソッドを呼び出しますが、デフォルトのままでは特に何も処理されないのでサブクラスを定義し、ハンドラーメソッドを上書きする必要があります。

ハンドラーメソッド

派生クラス内でハンドラーメソッドを上書きしてタグを見つけた際の処理を定義します。

例えば、開始タグを見つけた場合は、handle_starttag()メソッド が呼び出されます。

from html.parser import HTMLParser

class MyParser(HTMLParser):
    
    # 開始タグを扱うメソッド
    def handle_starttag(self, tag, attrs):
        pass

tag引数 には、小文字に変換されたタグの名前が格納されており、attrs引数 には、そのタグの属性が (name, value) の形でリストとして格納されています。

他にも終了タグを見つけた際に実行される handle_endtag()メソッド やタグ内の要素を扱う handle_data()メソッド など色々なハンドラーメソッドが定義されています。

LinkHTMLParser メソッド - html.parser--- HTML および XHTML のシンプルなパーサー — Python ドキュメント

例えば、タグ名と属性を出力するだけなら以下のように上書きします。

class MyParser(HTMLParser):
    
    # 開始タグを扱うメソッド
    def handle_starttag(self, tag, attrs):
        print(f'開始タグ: {tag}')
        for attr in attrs:
            print(f'\t属性: {attr}')

パーサーにデータを入力する

パーサーにデータを入力するには feed()メソッド を使います。feed()メソッド にHTML文字列を渡すことで処理が開始されます。

parser = MyParser()
parser.feed(HTML文字列)

試しに簡単なHTMLデータから開始タグと属性を出力してみます。

from html.parser import HTMLParser

class MyParser(HTMLParser):
    
    # 開始タグを扱うメソッド
    def handle_starttag(self, tag, attrs):
        print(f'開始タグ: {tag}')
        for attr in attrs:
            print(f'\t属性: {attr}')


# HTML文字列
html = '''<!DOCTYPE html>
<html lang="ja">
 <head>
 <meta charset="utf-8">
 <title>サイトタイトル</title>
 </head>
 <body>

 <h1>タイトル</h1>

 <h2>見出し2</h2>
 <p>コンテンツの内容</p>

 </body>
</html>'''

# パーサー生成
parser = MyParser()

# パーサーにデータを入力 
parser.feed(html)

実行結果

開始タグ: html
 属性: ('lang', 'ja')
開始タグ: head
開始タグ: meta
 属性: ('charset', 'utf-8')
開始タグ: title
開始タグ: body
開始タグ: h1
開始タグ: h2
開始タグ: p

URLから解析

URLからHTML文字列を取得して解析することもできます。

【Python】任意のサイトのHTMLを文字列で取得する方法この記事では、Python で任意のURLからそのサイトのHTMLを文字列型で取得する方法を解説します。HTMLを文字列で取得することで lxml ライブラリなどを使ってサイトを解析したり、スクレイピングしたりできます。それでは、URLからHTMLを文字列として取得する方法を見ていきましょう!...
import requests
from html.parser import HTMLParser

# 適当なURL
url = 'https://yumarublog.com/python/str'

# Webページを取得
r = requests.get(url)


class MyParser(HTMLParser):
    
    # 開始タグを扱うメソッド
    def handle_starttag(self, tag, attrs):
        print(f'開始タグ: {tag}')
        for attr in attrs:
            print(f'\t属性: {attr}')


# パーサー生成
parser = MyParser()

# パーサーにデータを入力 
parser.feed(r.text)

実行結果

開始タグ: html
 属性: ('lang', 'ja')
開始タグ: head
 属性: ('prefix', 'og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#')
開始タグ: meta
 属性: ('charset', 'utf-8')
開始タグ: meta
 属性: ('http-equiv', 'X-UA-Compatible')
 属性: ('content', 'IE=edge')
開始タグ: meta
 属性: ('name', 'viewport')
 属性: ('content', 'width=device-width, initial-scale=1')
開始タグ: meta
 属性: ('property', 'og:type')
 属性: ('content', 'blog')

...省略
ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago