Python

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

この記事では、Pythonの標準モジュールであるhtml.parserモジュールのHTMLParserクラスを使ってHTML文字列を解析する方法を解説します。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を文字列で取得することで ...
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')

...省略
最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』