Beautiful SoupによるPythonでのスクレイピング
Beautiful SoupはPythonでスクレイピングを行うのに役立つオープンソースのライブラリで,HTMLやXMLからデータを取得することができます.
オンラインショップのように均質な造りのサイトで手元にURLのリストがあるのなら,各ページから商品名や価格を抽出することができます.
目次
インストール
macOS 11系,Python 3.9.4の例です.
pip3 install requests |
パース
はじめにモジュールをインポートしておきます.
import requests |
コンテンツのパースをwebから行うには次のようにします.
url = requests.get("対象のURL") |
手元にHTMLファイルがある場合は,変数html_doc
に格納した後,直接
soup = BeautifulSoup(html_doc, "html.parser") |
とします.
find
変数soup
から抽出します.
要素の取得
findにより1要素取得する例です.
content = soup.find('h2', class_="クラス名") |
クラス属性を指定するのに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') |
と書けます.