【Python】BeautifulSoupのselectの普通の使い方【スクレイピング】

269, 2019-12-26

目次

はじめに

PythonのBeautifulSoup4というライブラリはスクレイピングなどで活躍する高レベルなHTML/XMLパーサーです。
これを使うとBeautifulSoup4内部のパーサーを自由に切り替えてHTMLをパースすることが出来ます。
今回はこのBeautifulSoup4のメソッドであるselectメソッドの使い方について解説したいと思います。

ちなみにBeautifulSoup4を利用するには↓のようにpipでインストールする必要があります。

$ pip install beautifulsoup4

selectメソッドの使い方

selectメソッドは↓のようにして使います。

from bs4 import BeautifulSoup

html = '''
<p>My name is Taro.</p>
<p class="myclass">How do you doing?</p>
<p class="myclass">I'm fine thank you.</p>
'''

soup = BeautifulSoup(html, 'html.parser')
founds = soup.select('.myclass')
print(founds)

出力結果は↓になります。

[<p class="myclass">How do you doing?</p>, <p class="myclass">I'm fine thank you.</p>]

selectは第1引数のセレクターに従って要素を取得します。
↓の場合はクラス名myclassを持つ要素を取得しています。

founds = soup.select('.myclass')

selectメソッドの戻り値

selectメソッドは要素が見つかった場合、bs4.element.ResultSetで結果を返します。

founds = soup.select('.myclass')
print(type(founds))
<class 'bs4.element.ResultSet'>

これはPython組み込みのリストを継承したクラスです。

class ResultSet(builtins.list)
 |  ResultSet(source, result=())
 |
 |  A ResultSet is just a list that keeps track of the SoupStrainer
 |  that created it.
 |
 |  Method resolution order:
 |      ResultSet
 |      builtins.list
 |      builtins.object
 |  ...

なのでリストのように使うことが出来ます。

founds = soup.select('.myclass')
print(founds[0])
print(type(founds[0]))
<p class="myclass">How do you doing?</p>
<class 'bs4.element.Tag'>

各要素にはbs4.element.Tagが格納されています。
よって、要素にアクセスしてから再度selectなどを使うことが出来ます。
もちろんfindfind_allなどのメソッドも使えます。

founds = soup.select('.myclass')
founds[0].select('.next')

selectは要素が見つからなかった場合、空のbs4.element.ResultSetを返します。

founds = soup.select('.notfound')
print(len(founds))
0

selectのセレクターの使い方

selectの肝となるセレクターの使い方です。

Beautiful Soup supports most CSS4 selectors
(BeautifulSoupはほとんどのCSS4セレクターをサポートしています)

とあるように、BeautifulSoupではほとんどのCSSセレクタを使うことが出来ます。

例えばIDの指定は↓のようにします。

soup.select('#myid')

クラス名を指定して複数の要素を取得するには↓のようにします。

soup.select('.myclass')

タグ名を指定するには↓のようにします。

soup.select('p')

タグの親子関係を指定するには↓のようにします。

soup.select('html body p')

タグのすぐ下のタグを検索するには>を使います。

soup.select('html > body')

複数のクラス名をANDで指定したい場合は↓のようにします。

soup.select('.cat.dog.bird')

探索の収納個数を指定

探索で得る要素の数を指定したい場合はlimitに整数を指定します。

soup.select('.myclass', limit=1) # 1個だけ
soup.select('.myclass', limit=2) # 2個だけ

おわりに

セレクターを使ってパースできるというのは、かなり便利だと思います。
みなさんもよきスクレイピングライフを。

アディオス、カウボーイ

関連記事

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

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

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク