BeautifulSoup4の基本的な使い方

2019年12月10日

みなさまおはこんばんにちは、せなです

今回はPythonを使用したスクレイピングで役立つ外部ライブラリの「BeautifulSoup4」の使い方を紹介したいと思います

BeautifulSoup4のインストール

インストールには以下のコマンドを使用します

pip install bs4

※「pip install beautifulsoup4」でもインストールできます

BeautifulSoup4のパーサーについて

パーサーとは「BeautifulSoup(markup, 'html.parser')」html.parserのことを指します

BeautifulSoup4はいくつかのパーサーに対応しています
Pythonで標準搭載されているHTMLパーサーにも対応していますが、より高速での動作を期待したい場合やPythonのverが3.2.2以前の場合には以下のパーサーのいずれかをインストールする必要があります

  • lxml : pip install lxml
  • html5lib : pip install html5lib

lxmlはHTML以外にもXMLに唯一対応しており、標準ライブラリよりも高速で動作します

html5libはBeautifulSoup4に対応していて、HTML5などにも対応していますが、動作が遅いです

今回はPython標準搭載のパーサーを使用します

BeautifulSoup4でよく使うメソッド:find(),find_all()

from bs4 import BeautifulSoup
import requests
url = 'https://www.google.co.jp/search?hl=ja&num=10&q=BeautifulSoupドキュメント'
html_res = requests.get(url)
soup = BeautifulSoup(html_res.text, 'html.parser')
print(soup.prettify())
soup.find('div', class_='BNeawe UPmit AP7Wnd')
soup.findAll('div', class_='BNeawe vvjwJb AP7Wnd')
----結果(一部)----
....
<div class="kCrYT">
   <div class="BNeawe vvjwJb AP7Wnd">
   </div>
   <div class="BNeawe UPmit AP7Wnd">
   </div>
  </a>
</div>

prettify()メソッドは取得したデータをきれいに整形して出力することができます
prettify()メソッドを使用することでfind()メソッドなどでどこをフィルターに設定するかを調べることができます

soup.find('div', class_='BNeawe UPmit AP7Wnd')
----結果----
<div class="BNeawe UPmit AP7Wnd"></div>

find()メソッドは最初に一致した結果のみを返却します

find()メソッドの引数は次のようになります(name, attrs, recursive=True, text, **kwargs)
上のソースコードだと「'div'」がnameで「class_='BNeawe UPmit AP7Wnd'」がattrsに当たります

※classにアンダースコア(_)が付いているのはPythonの予約後にclassが存在するためです

※「'BNeawe UPmit AP7Wnd'」はprettify()メソッドで取得したデータの中にあるCSSクラス名のことです

soup.findAll('div', class_='BNeawe vvjwJb AP7Wnd')
----結果一部----
[<div class="BNeawe vvjwJb AP7Wnd">...]

find_all()メソッドは一致したすべての結果を返却します

find_all()メソッドの引数は次のようになります(name, attrs, recursive=True, text, limit, **kwargs)

find()find_all()の引数の内容は以下のようになります

  • name = タグ名
  • attrs = CSSクラス名
  • recursive = 子クラスの探査有無(デフォルトTrue)
  • text = タグの間の文字列を検索
  • limit = 返却結果の最大数指定
  • kwargs = どんな名前のタグでも検索に使用できる

最後に

最も使用頻度が高いであろうfind()とfind_all()の説明を行わせていただきました
私もあまり使いこなせていないので説明が雑な気がします

ここまで読んで下さり、ありがとうございました
ではでは~