BeatutifulSoupの.selectの使い方[Python/スクレイピング]

programming.jpg

こんにちは

Pythonのスクレイピングでは、.select()メゾットも使います。

そのため、今回は.select()メゾットの使い方を見ていきます。

.select()とは

.select()はTagオブジェクトやBeautifulSoupオブジェクトに文字列を渡すことで、CSSセレクタによる要素を取得をすることができるメゾットです。

スクレピングするもの

今回スクレイピングするものは、以下になります。

本記事の内容はJupyterLabなどの対話型の環境で実行してみてください。

html_doc = """
<html><head><title>カレーのおすすめ具材</title></head>
<body>
<p class="title"><b>カレーの具材一覧</b></p>

<p class="food">野菜編
<a href="http://example.com/potatoes" class="vegetable" id="link1">じゃがいも</a>,
<a href="http://example.com/carrots" class="vegetable" id="link2">にんじん</a> ,
<a href="http://example.com/onion" class="vegetable" id="link3">たまねぎ</a>,
</p>
</body></html>
"""

検索方法

それでは検索方法を見ていきましょう。

必要な物をインポートしましょう。

from bs4 import BeautifulSoup

今回インポートするのは、Beautifulsoupだけですね。

soup = BeautifulSoup(html_doc)

タグで絞り込む

.selectメゾットを使ってタグの要素を取得するためには、以下のように記述します。

soup.select("title")
#<title>カレーのおすすめ具材</title>

titleタグの要素を取得することができましたね

次に複数要素がある場合を取得してみましょう。

soup.select("a")
#[<a class="vegetable" href="http://example.com/potatoes" id="link1">じゃがいも</a>,
#<a class="vegetable" href="http://example.com/carrots" id="link2">にんじん</a>,
#<a class="vegetable" href="http://example.com/onion" id="link3">たまねぎ</a>]

.selectでは該当する要素を全て取得してきます。

find_allに似ていますね。

要素を絞り込む

複数のタグの要素を取得したい場合

.select()メゾットに複数のタグを入れることで、取得結果を絞り込むことができます。

soup.select("body a")
#[<a class="vegetable" href="http://example.com/potatoes" id="link1">じゃがいも</a>,
#<a class="vegetable" href="http://example.com/carrots" id="link2">にんじん</a>,
#<a class="vegetable" href="http://example.com/onion" id="link3">たまねぎ</a>]

bodyタグの中のaタグを取得することができました。

直後のタグの要素を取得したい場合

次に直後のタグを取得したい場合は以下になります。

soup.select("head>title")
#[<title>カレーのおすすめ具材</title>]

直後のタグの要素を取得したい場合は、「>(大なり)」の記号を使用します。

IDを使用して要素を取得したい場合

IDを使用して要素を取得したい場合は以下になります。

soup.select("#link1")
#[<a class="vegetable" href="http://example.com/potatoes" id="link1">じゃがいも</a>]

取得したいIDの前に「#(シャープ)」を入力します。

クラスを使用して要素を取得したい場合

クラス使用してタグを取得したい場合は以下になります。

soup.select(".vegetable")
#[<a class="vegetable" href="http://example.com/potatoes" id="link1">じゃがいも</a>,
# <a class="vegetable" href="http://example.com/carrots" id="link2">にんじん</a>,
# <a class="vegetable" href="http://example.com/onion" id="link3">たまねぎ</a>]

クラスの前に「.(ドット)」を入力します。

また、クラスを使用する場合には以下の方法もあります。

soup.select("[class~=vegetable]")
#[<a class="vegetable" href="http://example.com/potatoes" id="link1">じゃがいも</a>,
# <a class="vegetable" href="http://example.com/carrots" id="link2">にんじん</a>,
# <a class="vegetable" href="http://example.com/onion" id="link3">たまねぎ</a>]

クラスをリスト形式にして「class~=クラス名」を入力します。

どちらを使っても、同じ結果が出力されます。

指定するタグの兄弟要素を取得したい場合

指定する要素と兄弟関係にある要素を取得したい場合に使用します。

兄弟関係とは、親要素が同じもので並列な関係の物です。

指定するタグの兄弟要素を取得したい場合は以下になります。

soup.select("#link1~ .vegetable")
#[<a class="vegetable" href="http://example.com/carrots" id="link2">にんじん</a>,
# <a class="vegetable" href="http://example.com/onion" id="link3">たまねぎ</a>]

IDがlink1の兄弟要素である2つを取得することができました。

また兄弟要素の1つ下を取得したい場合は、以下になります。

soup.select("#link1 + .vegetable")
#[<a class="vegetable" href="http://example.com/carrots" id="link2">にんじん</a>]

.クラス名を追加していくと、取得する要素を変えることができます。

属性の有無で要素を取得したい場合

属性の有無で要素を取得したい場合は、以下になります。

soup.select("[href]")
#[<a class="vegetable" href="http://example.com/potatoes" id="link1">じゃがいも</a>,
# <a class="vegetable" href="http://example.com/carrots" id="link2">にんじん</a>,
# <a class="vegetable" href="http://example.com/onion" id="link3">たまねぎ</a>]

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA