ユーニックス総合研究所

  • home
  • archives
  • bs4-attrs

BeautifulSoup4のattrsの使い方【Python】

  • 作成日: 2021-04-14
  • 更新日: 2023-12-24
  • カテゴリ: BeautifulSoup4

BeaituflSoup4のattrsの使い方

PythonにはHTML/XMLをパースするためのライブラリBeautifulSoup4があります。
このライブラリを使うとHTML/XMLを簡単にパースすることができます。

今回はBeautifulSoup4のタグの属性である「attrs」を見ていきたいと思います。
attrsは辞書で、タグの属性と属性値が保存されています。
attrsを参照すればタグの属性値を得ることができます。

attrsとは?

attrsとはなんなのでしょうか?
これは先ほども言いましたが、辞書です。
タグの属性が辞書のキーで、属性値が辞書の値になっています。

attrsattributesの略かと思われます。
attributesattributeの複数形で、attributeは「属性」という意味です。
たとえば↓のタグの

<p class="hige"></p>  

classpタグの属性と言うことができます。
そして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を指定するにはpiplxmlをインストールする必要があります。

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を見てみました。
タグの属性を参照する機会はけっこう多いと思うのでよかったらこの記事をブックマークしておいてください。

🦝 < おれブラックペッパー好きなんだ

🐭 < 闇属性