.attrs と .get('href') による属性値の取得
.attrs と .get('href') による属性値の取得Beautiful Soup ( bs4 ) で HTML 要素から属性を取り出す場合、代表的に .attrs と .get() メソッドを使います。ここではリンク要素 (<a>) を例に、それぞれの挙動・利点・注意点を詳しく解説します。
1. .attrs ― 属性を dict で丸ごと取得
.attrs ― 属性を dict で丸ごと取得
| 特徴 | 説明 |
|---|---|
| 返り値 | Python の辞書 (dict) |
| キー | 属性名 (str) |
| 値 | 属性値(単一なら str、class のように複数値を取る場合は list[str]) |
| 利点 | 要素に付与されている全属性 を一括で確認・操作できる |
| 主な用途 | デバッグや属性の一括コピー・更新など |
属性の追加・更新も可能
HTML 生成・変換時にまとめて書き換えたいケースで便利です。
2. .get('href') ― 安全に 単一属性を取得
.get('href') ― 安全に 単一属性を取得
| 特徴 | 説明 |
|---|---|
| 返り値 | 属性があればその値、無ければ None(もしくは指定したデフォルト値) |
| 安全性 | 存在しない属性にアクセスしても KeyError を起こさない |
| 主な用途 | 特定の属性だけを確実に取得 したい場合(リンクの href、画像の src など) |
tag['href'] との違い
tag['href'] との違い
-
スクレイピングでは
.get()が推奨
HTML が不完全でも例外で処理が止まらず、欠損データをNoneで表現できるため後処理が簡単です。
3. 典型的な使い分けパターン
| シナリオ | 推奨メソッド | 理由 |
|---|---|---|
| 取得前に全属性を調査したい | .attrs |
まとめて中身を確認できる |
| 必要な属性が決まっている | .get('attr') |
不在時の安全性・シンプルなコード |
| スクリプトで属性を増減させる | .attrs |
辞書操作と同じ感覚で編集可能 |
4. 実践例:ページ内のすべてのリンク先 URL を収集
-
タグに
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