.attrs.get('href') による属性値の取得

Beautiful Soup ( bs4 ) で HTML 要素から属性を取り出す場合、代表的に .attrs.get() メソッドを使います。ここではリンク要素 (<a>) を例に、それぞれの挙動・利点・注意点を詳しく解説します。


1. .attrs ― 属性を dict で丸ごと取得

python
from bs4 import BeautifulSoup html = '<a id="top" href="https://example.com" class="btn primary">Example</a>' soup = BeautifulSoup(html, 'html.parser') a_tag = soup.a print(a_tag.attrs) # => {'id': 'top', 'href': 'https://example.com', 'class': ['btn', 'primary']}
特徴 説明
返り値 Python の辞書 (dict)
キー 属性名 (str)
属性値(単一なら strclass のように複数値を取る場合は list[str]
利点 要素に付与されている全属性 を一括で確認・操作できる
主な用途 デバッグや属性の一括コピー・更新など

属性の追加・更新も可能

python
a_tag.attrs['target'] = '_blank' # 追加 a_tag.attrs['href'] = '/local.html' # 上書き

HTML 生成・変換時にまとめて書き換えたいケースで便利です。


2. .get('href') ― 安全に 単一属性を取得

python
href_value = a_tag.get('href') print(href_value) # => 'https://example.com' print(a_tag.get('title')) # => None(存在しないと None が返る) print(a_tag.get('title', '')) # => '' (デフォルト値を指定)
特徴 説明
返り値 属性があればその値、無ければ None(もしくは指定したデフォルト値)
安全性 存在しない属性にアクセスしても KeyError を起こさない
主な用途 特定の属性だけを確実に取得 したい場合(リンクの href、画像の src など)

tag['href'] との違い

python
a_tag['href'] # 属性が無いと KeyError a_tag.get('href') # 属性が無いと None
  • スクレイピングでは .get() が推奨
    HTML が不完全でも例外で処理が止まらず、欠損データを None で表現できるため後処理が簡単です。


3. 典型的な使い分けパターン

シナリオ 推奨メソッド 理由
取得前に全属性を調査したい .attrs まとめて中身を確認できる
必要な属性が決まっている .get('attr') 不在時の安全性・シンプルなコード
スクリプトで属性を増減させる .attrs 辞書操作と同じ感覚で編集可能

4. 実践例:ページ内のすべてのリンク先 URL を収集

python
from bs4 import BeautifulSoup from urllib.parse import urljoin import requests resp = requests.get('https://docs.python.org/ja/3/') soup = BeautifulSoup(resp.text, 'html.parser') base = resp.url links = [] for a in soup.select('a[href]'): href = a.get('href') # 安全に取り出す full = urljoin(base, href) # 絶対 URL へ変換 links.append(full) print(f'リンク数: {len(links)}')
  • タグに href が無い場合は select('a[href]') が除外してくれる

  • .get('href') により不正なタグでも例外を回避


5. よくある落とし穴と対策

落とし穴 対策
class 属性はリストで返る tag.get('class') # ['btn', 'primary'] ' '.join(tag.get('class', [])) で文字列化
属性が無いと KeyError tag['title'] tag.get('title') を使う
属性値が相対パス <a href="../page.html"> urljoin() で絶対化
HTML が壊れている <a href> のみ .get('href') is None で欠損チェック

まとめ

  • .attrs: 要素の属性を辞書として一括取得・編集。

  • .get('attr'): 指定属性を安全に取得。欠損時に None やデフォルト値を返す。

  • スクレイピングでは .get() を基本 とし、必要に応じて .attrs で全体を把握・更新するのが実践的です。

ChatGPT4o 生成日:2025/06/19