BeautifulSoupでHTML/XHTMLの開始タグを抽出する
RegExを用いてHTML/XHTMLの開始タグを抽出する方法
この解説では、RegExを用いてHTML/XHTML文書中の開始タグを抽出する方法について説明します。ただし、XHTMLの自己完結タグは除外します。
RegExパターン
以下のRegExパターンは、HTML/XHTML文書中の開始タグを抽出するために使用できます。
<([^\s>]+)(?:\s[^>]*)?>
パターン解説
<
: 開始タグの開始を表す([^\s>]+)
: タグ名を取得する。空白文字 () と
>
以外の一文字以上の文字列にマッチ(?:\s[^>]*)?
: 属性部分を取得する。空白文字 () と
>
以外の一文字以上の文字列が0回以上続く部分にマッチ。ただし、この部分は非キャプチャグループのため、抽出結果には含まれません。
動作例
以下のHTML文書を例として、上記のRegExパターンで開始タグを抽出してみます。
<html lang="ja">
<head>
<title>サンプルページ</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
このパターンを実行すると、以下の結果が得られます。
<html>
<head>
<title>
<h1>
<body>
XHTMLの自己完結タグの除外
XHTMLには、<br />
や <img />
のように、開始タグと終了タグが一体になった自己完結タグが存在します。上記のRegExパターンは、これらのタグも抽出してしまうため、除外したい場合はパターンを修正する必要があります。
以下のパターンは、XHTMLの自己完結タグを除外するために修正したものです。
<([^\s>]+)(?:\s[^>]*)(?<!/)?>
修正点
(?<!/)
: 終了タグ/
の直前にマッチしないことを条件に追加
<html>
<head>
<title>
<h1>
<body>
注意事項
- このRegExパターンは、基本的なHTML/XHTML文書にのみ対応しています。複雑な文書や特殊なタグを使用している場合は、パターンを修正する必要がある場合があります。
- RegExパターンの詳細は、参考資料を参照してください。
補足
- 上記の解説は、RegExの基本的な知識があることを前提としています。RegExについて詳しく知らない場合は、事前に学習することをおすすめします。
- RegExパターンは、さまざまな方法で記述できます。上記のパターンは一例であり、必要に応じて修正してください。
import re
def extract_tags(html):
"""
HTML文書から開始タグを抽出する
Args:
html: HTML文書
Returns:
開始タグのリスト
"""
pattern = r"<([^\s>]+)(?:\s[^>]*)(?<!/)?>"
return re.findall(pattern, html)
if __name__ == "__main__":
html = """
<html lang="ja">
<head>
<title>サンプルページ</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
"""
tags = extract_tags(html)
print(tags)
出力結果
['<html>', '<head>', '<title>', '<h1>', '<body>']
解説
extract_tags
関数は、引数として渡されたHTML文書から開始タグを抽出します。re.findall
関数は、RegExパターンにマッチする部分文字列をすべて抽出します。
実行方法
上記のコードをファイルに保存し、Pythonで実行します。
python extract_tags.py
RegEx以外でHTML/XHTMLの開始タグを抽出する方法
BeautifulSoupは、HTML/XML文書を解析するためのPythonライブラリです。以下のコードは、BeautifulSoupを使用して開始タグを抽出する例です。
from bs4 import BeautifulSoup
html = """
<html lang="ja">
<head>
<title>サンプルページ</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
"""
soup = BeautifulSoup(html, "html.parser")
tags = [tag.name for tag in soup.find_all()]
print(tags)
['html', 'head', 'title', 'h1', 'body']
BeautifulSoup
オブジェクトを作成します。find_all
メソッドを使用して、すべてのタグを取得します。tag.name
属性を使用して、タグ名を取得します。
from lxml import etree
html = """
<html lang="ja">
<head>
<title>サンプルページ</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
"""
root = etree.fromstring(html)
tags = [tag.tag for tag in root.iter()]
print(tags)
['html', 'head', 'title', 'h1', 'body']
etree.fromstring
関数を使用して、HTML文書を解析します。iter
メソッドを使用して、すべての要素を反復処理します。
RegEx以外にも、BeautifulSoupやlxmlなどのライブラリを使用して、HTML/XHTMLの開始タグを抽出することができます。それぞれの方法にはメリットとデメリットがあり、状況に応じて使い分けることが重要です。
html regex xhtml