PythonとBeautifulSoupによるHTML解析入門

この記事では、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()で取得した要素オブジェクトから、idclass、リンク先の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スクレイピングを行う上で、requestsBeautifulSoupの組み合わせは基本かつ不可欠なテクニックです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次