Beautiful SoupはPythonでスクレイピングを行うのに役立つオープンソースのライブラリで,HTMLやXMLからデータを取得することができます.

オンラインショップのように均質な造りのサイトで手元にURLのリストがあるのなら,各ページから商品名や価格を抽出することができます.

目次

  1. インストール
  2. パース
  3. find
    1. 要素の取得
    2. タグの除去
    3. 該当箇所全ての取得
    4. 属性の取得
    5. 属性を指定した取得
  4. 前後関係による要素の取得
  5. セレクタによる取得

インストール

macOS 11系,Python 3.9.4の例です.

pip3 install requests
pip3 install beautifulsoup4

パース

はじめにモジュールをインポートしておきます.

import requests
from bs4 import BeautifulSoup

コンテンツのパースをwebから行うには次のようにします.

url = requests.get("対象のURL")
soup = BeautifulSoup(url.content, "html.parser")

手元にHTMLファイルがある場合は,変数html_docに格納した後,直接

soup = BeautifulSoup(html_doc, "html.parser")

とします.

find

変数soupから抽出します.

要素の取得

findにより1要素取得する例です.

content = soup.find('h2', class_="クラス名")
print(content)
# h2タグ付きで出力される
print(content.get_text())
# タグなしで出力される

クラス属性を指定するのにclass_としていますが,IDならidです.

タグの除去

findで要素を取得していますが,タグの内側だけ欲しい場合は,get_textを使います.
get_textはタグを全て除去します.

該当箇所全ての取得

find_allなら該当要素を全て取得できます.
li要素をfind_allしてliタグ内をget_textで取得するには,

texts_li = [li.get_text() for li in contents.find_all('li')]

とします.

属性の取得

属性を取得することもできます.
a要素をfind_allした上で,各href属性を取得するには,getを使って

links = [url.get('href') for url in soup.find_all('a')]

とします.

属性を指定した取得

属性を指定して取得する例は次の通りです.

soup.find_all("a", href="リンク先")

前後関係による要素の取得

以下のような取得方法があります.

  • 親要素の取得:find_parents()find_parent()
  • 兄弟要素の取得:find_next_siblings()find_next_sibling()find_previous_siblings()find_previous_sibling()
  • 前方/後方に存在する要素の取得:find_all_next()find_next()find_all_previous()find_previous()

セレクタによる取得

findでなく,セレクタを対象とするselectを使うこともできます.
この場合,

soup.select("a[href='リンク先']")

のように書きます.
selectではCSSライクな書き方ができるため,例えばクラスは.を使って,

soup.select('div p.hoge')

のような指定ができます.
同様に,IDなら#を使って,取得が1つだけでよい場合には

soup.select_one('#なにかのID')

と書けます.