閉じる

Python BeautifulSoupで属性値を取得する方法:get()と辞書アクセスの違いを整理

Pythonを用いたWebスクレイピングにおいて、HTML要素から特定の属性値を取り出す作業は非常に頻繁に発生します。

特にBeautifulSoupライブラリを利用する場合、属性の取得方法は一つではなく、状況に応じた使い分けが求められます。

本記事では、属性取得の代表的な手法であるget()メソッドと辞書形式(ブラケット)によるアクセスの違いについて整理します。

スクレイピングの実務で役立つエラー回避術や、2026年現在のベストプラクティスも踏まえて詳しく解説します。

BeautifulSoupにおける属性取得の基本

BeautifulSoupで解析したHTMLタグ(Tagオブジェクト)には、属性が辞書のような形式で格納されています。

例えば、aタグの「href」属性や、imgタグの「src」属性などが取得対象となります。

これらの属性値を取得することで、リンク先のURLを抽出したり、画像の保存先を特定したりすることが可能になります。

属性の取得には、主にget()メソッドを使用する方法と、辞書のように['href']と記述する方法の2種類が存在します。

一見するとどちらも同じ結果を返しますが、指定した属性が存在しない場合の挙動が大きく異なります。

get()メソッドによる属性の取得

もっとも推奨される安全な方法は、get()メソッドを利用することです。

get()メソッドの基本的な使い方

get()メソッドは、引数に取得したい属性名を文字列で渡します。

Python
from bs4 import BeautifulSoup

html = '<a href="https://example.com" id="link1">Example</a>'
soup = BeautifulSoup(html, 'html.parser')
tag = soup.find('a')

# get()メソッドで属性を取得
url = tag.get('href')
print(url)
実行結果
https://example.com

存在しない属性を指定した場合の挙動

get()メソッドの最大のメリットは、対象の属性が存在しない場合にNoneを返す点にあります。

プログラムがエラーで停止することを防げるため、不特定多数のページを巡回するスクレイピングにおいて非常に有用です。

Python
# 存在しない 'class' 属性を指定
class_name = tag.get('class')
print(class_name)
実行結果
None

デフォルト値を設定する

get()メソッドの第2引数を利用すると、属性が存在しなかった場合のデフォルト値を指定できます。

Python
# 属性がない場合に 'default_value' を返す
value = tag.get('class', 'default_value')
print(value)
実行結果
default_value

辞書形式([])による属性の取得

Pythonの辞書(dict)オブジェクトのように、ブラケットを使用して属性を取得することも可能です。

辞書形式の記述方法

コードが簡潔になるため、小規模なスクリプトや構造が保証されているHTMLの解析によく使われます。

Python
# 辞書形式で取得
url = tag['href']
print(url)
実行結果
https://example.com

属性が存在しない場合のリスク

辞書形式でアクセスした場合、もし対象の属性が存在しないとKeyErrorが発生してプログラムが異常終了します。

例外処理(try-except)を記述していない場合、スクレイピングが途中で止まってしまうため注意が必要です。

確実にその属性が存在すると分かっている場合を除き、基本的にはget()の使用が推奨されます。

get()と辞書アクセスの比較まとめ

それぞれの特徴を比較表にまとめました。

比較項目get()メソッド辞書形式 (tag[‘attr’])
属性が存在する場合属性値を返す属性値を返す
属性が存在しない場合None を返すKeyError が発生する
デフォルト値の指定可能不可能
コードの堅牢性高い(エラーになりにくい)低い(例外処理が必要)

特殊な属性の扱い:マルチバリュー属性(classなど)

BeautifulSoupでは、HTMLの仕様に基づき一部の属性を「リスト」として扱います。

特にclass属性は、一つの要素に複数のクラスが指定されることが多いため、取得結果は文字列ではなくリスト形式になります。

class属性の取得例

Python
html_with_class = '<div class="container main-content"></div>'
soup = BeautifulSoup(html_with_class, 'html.parser')
div_tag = soup.find('div')

# クラス属性を取得
classes = div_tag.get('class')
print(classes)
実行結果
['container', 'main-content']

このように、複数の値を持つ属性はリストで返される点に注意してください。

一方で、id属性などは常に単一の値を返すため、文字列として取得されます。

属性の存在を確認する方法:has_attr()

属性値を取得する前に、そもそもその属性が含まれているかを確認したい場合は、has_attr()メソッドを使用します。

条件分岐(if文)と組み合わせることで、より柔軟なロジックを組むことができます。

Python
if tag.has_attr('href'):
    print("href属性が存在します")
else:
    print("href属性は見つかりませんでした")

特定の属性を持つ要素だけを処理したい場合に、非常に有効な手段となります。

実践的な使い分けのガイドライン

実務においては、以下のような基準で使い分けるのが一般的です。

  • get()を使うべき場面:Web上の不特定多数のページをスクレイピングし、要素の構造が一部欠落している可能性がある場合。
  • 辞書形式([])を使う場面:自分で作成したHTMLのテストや、特定のテンプレートに基づいた厳密な構造を持つサイトを解析する場合。

初心者のうちは、常にget()メソッドを使用する習慣をつけておくのが、予期せぬエラーを防ぐ最短ルートです。

また、属性を取得する前に対象のタグ自体がNoneでないか(findの結果が成功しているか)をチェックすることも忘れないようにしましょう。

まとめ

PythonのBeautifulSoupで属性値を取得するには、get()メソッドと辞書形式の2つのアプローチがあります。

get()メソッドは、属性が存在しない場合にNoneを返すため、プログラムのクラッシュを防ぐ安全な選択肢です。

対して辞書形式は、記述が簡潔ですが、属性が欠落している場合にKeyErrorを発生させるというリスクを伴います。

また、class属性のように複数の値を持つものはリストとして返されるというBeautifulSoup特有の挙動も重要です。

これらの特性を正しく理解し、エラーに強い効率的なスクレイピングコードの実装に役立ててください。

URLをコピーしました!