【Python】BeautifulSoupでclassを指定して要素を取得する方法【スクレイピング】

263, 2019-12-09

目次

はじめに

BeautifulSoupの使い方を解説しています。

class_を指定して要素を取得する方法

BeautifulSoupで特定のクラス名を指定して要素を取得したい場合があります。
例えば↓のようなHTMLがあった場合です。

<p class="dog">I am dog!</p>
<p class="cat">I am cat!</p>
<p class="bird">I am bird 1!</p>
<p class="bird">I am bird 2!</p>

↑のpタグの一覧からクラス名にcatが含まれているタグを取得したい場合、↓のようにします。

from bs4 import BeautifulSoup

html = '''
<p class="dog">I am dog!</p>
<p class="cat">I am cat!</p>
<p class="bird">I am bird 1!</p>
<p class="bird">I am bird 2!</p>
'''

soup = BeautifulSoup(html, 'html.parser')
found = soup.find('p', class_='cat')
print(found.text)

↑のコードを実行すると↓のような結果になります。

I am cat!

注目したいのが↓のタグを取得している所です。

cat = soup.find('p', class_='cat')

BeautifulSoupオブジェクトのfindメソッドの第1引数に要素名を指定すると、その要素を取得することが出来ます。
さらにfindメソッドのキーワード引数class_に取得したいクラス名を指定すると、指定のクラス名を持つ要素を取得することが出来ます。

もちろんこのclass_属性はfind_allメソッドでも使うことが出来ます。

birds = soup.find_all('p', class_='bird')
print(birds)

↑のコードの実行結果は↓のようになります。

[<p class="bird">I am bird 1!</p>, <p class="bird">I am bird 2!</p>]

複数のクラス名でAND検索

findメソッドなどのclass_属性には複数のクラス名を指定することが出来ます。

from bs4 import BeautifulSoup

html = '''
<p class="dog">I am dog!</p>
<p class="cat bird">I am cat bird!</p>
'''

soup = BeautifulSoup(html, 'html.parser')
found = soup.find('p', class_='cat bird')
print(found)

↑のコードを実行すると↓のような結果になります。

<p class="cat bird">I am cat bird!</p>

↑の場合、catかつbirdのクラス名を持つ要素を取得します。
しかし、たとえばclass_='bird cat'のようにすると取得できません。

順不同のAND検索をしたい場合はselectメソッドを使うといいでしょう。

found = soup.select('p.cat.bird')
print(found)

↑のコードを実行すると↓のような結果になります。

[<p class="cat bird">I am cat bird!</p>]

複数のクラス名でOR検索

find_allclass_属性にリストなどを渡すとOR検索が可能です。

from bs4 import BeautifulSoup

html = '''
<p class="cat">I am dog!</p>
<p class="cat bird">I am cat bird!</p>
'''

soup = BeautifulSoup(html, 'html.parser')
found = soup.find_all('p', class_=['cat', 'bird'])
print(found)

↑のコードを実行すると↓のような結果になります。

[<p class="cat">I am dog!</p>, <p class="cat bird">I am cat bird!</p>]

↑の場合、クラス名にcatbirdを含む要素を取得しています。

attrsでclassを指定して要素を取得する方法

find, find_allではclass_属性の他にattrs属性も使うことが出来ます。
これにclassを指定すると指定したクラス名の要素を取得することが可能です。

cat = soup.find('p', attrs={ 'class': 'cat' })
print(cat)

birds = soup.find_all('p', attrs={ 'class': 'cat' })
print(birds)

おわりに

BeautifulSoupでは色々な方法でクラス名を指定することが出来ました。
柔軟でふわふわで美しいパーサーですね。
皆さんも良きスクレイピング・ライフを。

アディオス、カウボーイ

関連記事

Webアプリケーションの制作ならNARUPORT

Webアプリケーションの制作ならNARUPORTにお任せください。
Webアプリの他にもGUIアプリやChromeExtension, スクリプトの制作など可能です。
以下のお問い合わせフォームからご依頼ください!

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク