この記事では、Webスクレイピングなどで広く利用されるPythonライブラリBeautifulSoup
を使い、HTMLドキュメントから特定の情報を抽出するための基本的な方法について解説します。
1. 準備:BeautifulSoupのインストールとサンプルHTML
BeautifulSoup
はサードパーティ製のライブラリなので、使用する前にインストールが必要です。また、HTMLを効率的に解析するためのパーサーlxml
も一緒にインストールすることを推奨します。
pip install beautifulsoup4
pip install lxml
この記事のコードを試すために、以下の内容をsample.html
という名前で保存してください。
<html>
<head>
<title>Sample Page</title>
</head>
<body>
<h1>Page Title</h1>
<p id="intro" class="content-text">This is an introduction paragraph.</p>
<p class="content-text">
This is a second paragraph with a
<span id="main_highlight">highlighted</span> element.
</p>
</body>
</html>
2. BeautifulSoupオブジェクトの生成
HTMLからデータを抽出するには、まずその内容をBeautifulSoup
オブジェクトに変換する必要があります。この処理は、ウェブからダウンロードしたHTML文字列、またはローカルのHTMLファイルのどちらからでも行えます。
import requests
import bs4
# --- Webページから生成する場合 ---
# res = requests.get('http://example.com')
# res.raise_for_status()
# web_soup = bs4.BeautifulSoup(res.text, 'lxml')
# print(type(web_soup))
# --- ローカルファイルから生成する場合 ---
with open('sample.html', 'r', encoding='utf-8') as f:
local_soup = bs4.BeautifulSoup(f, 'lxml')
print(f"オブジェクトの型: {type(local_soup)}")
'lxml'
を指定することで、高速なlxmlパーサーを使用します。
3. select()
メソッドで要素を検索する
BeautifulSoup
オブジェクトのselect()
メソッドは、CSSセレクタを使ってHTMLドキュメント内の要素を検索する最も強力な方法の一つです。select()
は、条件に一致したすべての要素をリストとして返します。
IDで検索する (#id_name
) id
属性はページ内でユニークであるため、特定の要素をピンポイントで狙うのに使います。
# idが'intro'の要素を検索
elements = local_soup.select('#intro')
intro_paragraph = elements[0]
print(f"要素のテキスト: {intro_paragraph.getText()}")
print(f"要素のタグを含む文字列: {str(intro_paragraph)}")
タグ名で検索する (tag_name
) 指定したすべてのタグ(例: すべての<p>
タグ)を検索します。
# すべての<p>タグを検索
p_elements = local_soup.select('p')
print(f"見つかった<p>タグの数: {len(p_elements)}")
print(f"最初の<p>タグの内容: {p_elements[0].getText()}")
4. 要素の属性からデータを取得する
select()
で取得した要素オブジェクトから、id
やclass
、リンク先のhref
といった属性の値を取得することができます。
属性の値を取得するには.get()
メソッドを使います。
# idが'main_highlight'の<span>タグを検索
span_element = local_soup.select('#main_highlight')[0]
# 'id'属性の値を取得
span_id = span_element.get('id')
print(f"span要素のid属性: {span_id}")
# 存在しない属性を取得しようとするとNoneが返る
non_existent_attr = span_element.get('non_existent_attr')
print(f"存在しない属性: {non_existent_attr}")
.get()
メソッドは、属性が存在しない場合にエラーを発生させるのではなく、安全にNone
を返すため便利です。
まとめ
BeautifulSoup
ライブラリは、複雑なHTMLドキュメントを解析し、Pythonから操作可能なオブジェクトに変換します。特にselect()
メソッドは、CSSセレクタの知識を活かして目的のデータを効率的に抽出するための強力なツールです。Webスクレイピングを行う上で、requests
とBeautifulSoup
の組み合わせは基本かつ不可欠なテクニックです。