BeautifulSoup4のattrsの使い方【Python】
- 作成日: 2021-04-14
- 更新日: 2023-12-24
- カテゴリ: BeautifulSoup4
BeaituflSoup4のattrsの使い方
PythonにはHTML/XMLをパースするためのライブラリBeautifulSoup4があります。
このライブラリを使うとHTML/XMLを簡単にパースすることができます。
今回はBeautifulSoup4のタグの属性である「attrs」を見ていきたいと思います。
attrs
は辞書で、タグの属性と属性値が保存されています。
attrs
を参照すればタグの属性値を得ることができます。
attrsとは?
attrs
とはなんなのでしょうか?
これは先ほども言いましたが、辞書です。
タグの属性が辞書のキーで、属性値が辞書の値になっています。
attrs
はattributes
の略かと思われます。
attributes
はattribute
の複数形で、attribute
は「属性」という意味です。
たとえば↓のタグの
<p class="hige"></p>
class
はp
タグの属性と言うことができます。
そしてhige
は属性class
の属性値です。
HTML/XMLではタグの属性はそのタグの性質を決めるものです。
タグにクラスやIDを振ったり、横幅や高さ、最大入力数を設定したりするときに使われます。
特にHTMLではこの属性によってタグの振る舞いが大きく変わるため、非常に重要な概念となっています。
BeautifulSoup4ではパースしたHTML/XMLからタグを取得し、そのタグの属性をattrs
から参照することができます。
attrsの参照
では実際にattrs
を参照してみます。
↓がサンプルコードになります。
from bs4 import BeautifulSoup
code = '<p class="bird"></p>'
soup = BeautifulSoup(code, 'html.parser')
p = soup.p
print(p.attrs['class'])
サンプルコードではHTMLをパースして、p
タグを抜き出し、そのp
タグのattrs
属性を参照しています。
attrs
からclass
キーを参照して、その中身をprint()
で出力します。
↑のコードを実行すると↓のような結果になります。
['bird']
attrs
自体を参照してみるとattrs
がただの辞書だということがよくわかります。
↓のようにコードを変更して実行します。
print(type(p.attrs))
print(p.attrs)
実行結果は↓のようになります。
<class 'dict'>
{'class': ['bird']}
attrs
が辞書だということは、辞書のメソッドをそのまま使えるということになります。
たとえばget()
を使って属性値を得るには↓のようにします。
from bs4 import BeautifulSoup
code = '<p class="bird"></p>'
soup = BeautifulSoup(code, 'html.parser')
p = soup.p
print(p.attrs.get('class'))
実行すると↓のようになります。
['bird']
ダイレクトに属性値を参照する
attrs
を使わなくてもタグを角カッコで参照すれば属性値を得ることができます。
たとえば↓のようにです。
from bs4 import BeautifulSoup
code = '<p class="bird"></p>'
soup = BeautifulSoup(code, 'html.parser')
p = soup.p
print(p['class'])
実行結果は↓になります。
['bird']
属性を削除する
タグの属性を削除したい場合はdel
を使って対象の属性を削除します。
from bs4 import BeautifulSoup
code = '<p cat="nyan" dog="wan"></p>'
soup = BeautifulSoup(code, 'html.parser')
p = soup.p
del p.attrs['cat']
del p['dog']
print(p)
↑のコードを実行すると↓のような結果になります。
<p></p>
属性値を更新する
タグの属性値を更新したい場合は属性に値を代入します。
from bs4 import BeautifulSoup
code = '<p cat="nyan" dog="wan"></p>'
soup = BeautifulSoup(code, 'html.parser')
p = soup.p
p.attrs['cat'] = 'I know'
p['dog'] = 'gaururu'
print(p)
↑のコードを実行すると↓のような結果になります。
<p cat="I know" dog="gaururu"></p>
複数の属性値
BeautifulSoup4のタグでは複数の値を取りうる属性では、値がリストになります。
たとえばclass
がそうです。
from bs4 import BeautifulSoup
code = '<p class="one two"></p>'
soup = BeautifulSoup(code, 'html.parser')
p = soup.p
print(p['class'])
これは↓の結果になります。
['one', 'two']
しかしid
など、単一の属性値が入る属性はそのまま文字列で表現されます。
from bs4 import BeautifulSoup
code = '<p id="one two"></p>'
soup = BeautifulSoup(code, 'html.parser')
p = soup.p
print(p['id'])
実行すると↓のようになります。
one two
複数の属性値の禁止
複数の属性値を禁止したい場合はBeautifulSoup
のコンストラクタにmulti_valued_attributes=None
を指定します。
from bs4 import BeautifulSoup
code = '<p class="one two"></p>'
soup = BeautifulSoup(code, 'html.parser', multi_valued_attributes=None)
p = soup.p
print(p['class'])
class
属性が↓のように文字列で取得できているのがわかります。
one two
また、内部パーサーにxml
を指定した場合はclass
属性は単一の値になります。
内部パーサーにxml
を指定するにはpip
でlxml
をインストールする必要があります。
from bs4 import BeautifulSoup
code = '<p class="one two"></p>'
soup = BeautifulSoup(code, 'xml')
p = soup.p
print(p['class'])
結果↓。
onw two
id属性などをリストで取得する
id
属性の値を文字列ではなくリストで取得したい場合はタグのメソッドget_attribute_list()
を使います。
from bs4 import BeautifulSoup
code = '<p id="one two"></p>'
soup = BeautifulSoup(code, 'html.parser')
p = soup.p
print(p.get_attribute_list('id'))
実行すると↓のような結果になります。
['one two']
id属性などをマルチな属性にする
id
属性はデフォルトでは単一の属性値として処理されます。
これをマルチプル(複数)な属性にしたい場合はBeautifulSoupのコンストラクタにmulti_valued_attributes={'*': 'id'}
を指定します。
from bs4 import BeautifulSoup
code = '<p id="one two"></p>'
soup = BeautifulSoup(code, 'html.parser', multi_valued_attributes={'*': 'id'})
p = soup.p
print(p['id'])
↑のコードを実行すると↓のような結果になります。
['one', 'two']
id
の属性値がマルチプルになっているのがわかります。
BeautifulSoup4が設けているマルチプルにするかしないかのルールなどを参照したい場合は↓のコードを実行します。
from bs4.builder import builder_registry
print(builder_registry.lookup('html').DEFAULT_CDATA_LIST_ATTRIBUTES)
これを実行すると↓のような結果になります。
{'*': ['class', 'accesskey', 'dropzone'], 'a': ['rel', 'rev'], 'link': ['rel', 'rev'], 'td': ['headers'], 'th': ['headers'], 'form': ['accept-charset'], 'object': ['archive'], 'area': ['rel'], 'icon': ['sizes'], 'iframe': ['sandbox'], 'output': ['for']}
↑の定義を見るとデフォルトではclass
, accesskey
, dropzone
の属性がマルチプルになっているのがわかります。
おわりに
今回はBeautifulSoup4のattrs
を見てみました。
タグの属性を参照する機会はけっこう多いと思うのでよかったらこの記事をブックマークしておいてください。
🦝 < おれブラックペッパー好きなんだ
🐭 < 闇属性