BeautifulSoup4とは?メソッド、使い方まとめ【Pythonによるウェブスクレイピング】

BeautifulSoup4

BeaurifulSoup4はHTMLやXMLファイルを解析することができる、いわゆるWEBスクレイピングが可能になるPythonのライブラリの一つ。

少し難しく言うと、、、

Beautiful Soup はHTMLやXMLファイルからデータを取得するPythonのライブラリです。あなたの好きなパーサー(構文解析器)を使って、パースツリー(構文木)の探索、検索、修正を行います。 これはプログラマーの作業時間を大幅に短縮してくれます。

BeatifulSoup日本語ドキュメント

ドキュメント

様々な参考サイト※1を元に、同じような内容だけど、自分なりにまとめてみる。

まずはBeaurifulSoup のドキュメンテーションから。

日本語訳もある。

基本的な取得イメージの完成形

以下のコードはtarget_urlで指定したサイトのリンク先URLをすべて取得するコード。

import requests
from bs4 import BeautifulSoup

target_url = '***'
r = requests.get(target_url)
soup = BeautifulSoup(r.text, 'lxml')

for a in soup.find_all('a'):
      print(a.get('href'))

インストール

BeautifulSoup

BeautifulSoupはpipコマンドでインストール出来る。

$ pip install BeautifulSoup

requests

BeautifulSoupを使う場合には、だいたいこのモジュールも呼び出すことになる。
requestsは取得したHTTP構造から必要な情報(テキスト)を取得するのに使う。

$ pip install requests

インポート

from bs4 import BeautifulSoup

bs4はBeatifulSoupが格納されたパッケージ。

下のようにbs4全体を呼び出しているようなサンプルも見かけるが、無駄なパッケージも呼んでいると思うので、上の記述の方がよいだろう。

import bs4

情報を取得するrequestsパッケージも同時に呼び出す。

import requests

データを取得するURLを指定し、BeautifulSoupにセットする。
lxmlはパーサー(persor、構文解析器)と呼ばれている。

※lxmlについてこちらのサイトに詳しく説明がある。

requestパッケージについては、別途まとめる。

メソッド

メソッドの説明をするために、事前にデータを取得しておく。

target_url = 'https://www.yahoo.co.jp/'
r = requests.get(target_url) 
soup = BeautifulSoup(r.text, 'lxml')

基本操作

soup.string #文字列を取得する

データ取得系

soup.title #titleタグを取得する。
soup.title.string #titleタグで囲まれた文字列を取得する
soup.head #headタグを取得する。
soup.find('a') #aタグをすべて取得する。
soup.find_all('a') #aタグをすべて取得する。
soup.a #1つめのaタグを取得する。
soup.a.get("href") #hrefの値(つまりurl)を取得する
soup.select('a[href^="http://"]') # CSSセレクタ

使用例サンプル

例1)リンク先がYahoo!pickupのをすべて取得する。

soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))

例2)リンク先の属性指定

soup.find_all("a", class_="link", href="/link")
soup.find_all("a", attrs={"class": "link", "href": "/link"})
soup.find_all(class_="link", href="/link")
soup.find_all(attrs={"class": "link", "href": "/link"})

※class_だけアンダースコアがついているので注意。

例3)正規置換

import re
soup.find_all(re.compile("^b")) #bで始まるタグ
soup.find_all("a", text=re.compile("hello"))

出力系

soup.prettify() #取得した構文を表示する。

参考にした記事: