競馬予想のためのBeautifulSoup4入門

スクレイピング

 

BeautifulSoup って何ができるの。

パーサって何?

 

スクレイピングをやってみて、BeautifulSoupで苦労されている方、もう少し詳しく知りたい方に向けての記事です。

BeautifulSoupの理解を深めるために、前提知識となるHTMLやパサーについて解説し、BeautifulSoupで何ができるかを簡単に説明します。

 

 

1.BeautifulSoupについて

BeautifulSoupは、主にHTMLからデータを抽出するライブラリです。

Pythonにおけるスクレイピングの要になります。

 

今回は、BeautifulSoup4について話を進めていきます。

「4」はバージョンです。

2や3もありますが、最新のPythonではサポートしていないので、この記事ではBeautifulSoupとあれば、「BeautifulSoup4」のことを指しています。

 

 

2.HTMLの知識

BeautifulSoupがHTMLの情報を取得する以上、HTMLの知識が必要になります。

HTMLの基礎知識については以下にまとめましたので、そちらをご覧下さい。

 

私たちが普段目にしている、WebサイトのほとんどがこのHTMLで作られているので、Web系の開発では必須の知識となります。ゆくゆくはWebで開発の仕事がしたいなと考えている方は、この機に覚えてしまいましょう。

BeautifulSoupを使った、実際のHTML要素の指定方法は後ほど説明します。

 

競馬予想のためのWebスクレイピング【HTML入門】

 

 

3.パーサとは

解析処理のことをパーサと呼んでいます。

実際にコードを見てみましょう。BeautifulSoupの基本構文が以下です。

 

import requests
from bs4 import BeautifulSoup

url = requests.get('http://umano-ie.com/racesample/')  #Webページを取得

soup = BeautifulSoup(url.text, "html.parser")  #htmlを元に解析

 

6行目のかっこの左側が「何を取得するか」を指定していて、右側が「パーサ」を指定しています。

「取得した文字列データを、HTMLの解析に適した形で解析してくれ」というのが、6行目の意味になります。

 

 

パーサにはいくつか種類があるので、説明しておきます。

 

・html.parser

Pythonの標準的なHTMLパーサ

 

・lxml

外部ライブラリであるlxmlのHTMLパーサ。html.parserより処理が速い。

外部ライブライなので、pipでインストールが必要。

 

・html5lib

外部ライブラリであるhtml5libのHTMLパーサ。処理速度は遅い。

外部ライブライなので、pipでインストールが必要。

 

どれがいいのって話になりそうですが、筆者の感覚ではそれぞれ使って決めるでよいと考えています。

html5libは遅いですが、扱いやすいという人もいるので、使ってみて解析がうまくいかない場合に他を試してみることをおススメします。

 

 

4.BeautifulSopuでできること

実際は、まるっと取得したHTMLの情報をそのまま使うケースはなく、必要な情報に絞る作業が必要です。

BeautifulSoupのメソッドを使用すれば、HTMLの要素に紐づくデータはほぼ取得できます。

ここでは主要なものを紹介します。(簡単なコードにしているため、実行結果が荒いです。)

 

 

・○○.title

titleタグを取得する。

import requests
from bs4 import BeautifulSoup

url = requests.get('http://umano-ie.com/racesample/')
soup = BeautifulSoup(url.text, "html.parser")

getdata = soup.title
print(getdata)

#実行結果
<title>出馬表サンプル | うまのいえ</title>

 

 

・○○.head

headタグを取得する。

import requests
from bs4 import BeautifulSoup

url = requests.get('http://umano-ie.com/racesample/')
soup = BeautifulSoup(url.text, "html.parser")

getdata = soup.head
print(getdata)

#実行結果
​※データ量が多いので省略

 

 

・○○.find(‘取得条件’)

取得条件に一致したデータを取得する。

import requests
from bs4 import BeautifulSoup
url = requests.get('http://umano-ie.com/racesample/')
soup = BeautifulSoup(url.text, "html.parser")

getdata = soup.find('a')
print(getdata)

#実行結果
<a class="site-name site-name-text-link" href="http://umano-ie.com/" itemprop="url"><span class="site-name-text" itemprop="name about">うまのいえ</span></a>

 

 

・○○.find_all(‘取得条件’)

取得条件に一致したデータをすべて取得する。

import requests
from bs4 import BeautifulSoup

url = requests.get('http://umano-ie.com/racesample/')
soup = BeautifulSoup(url.text, "html.parser")

getdata = soup.find_all('a')
print(getdata)

#実行結果
※データ量が多いので省略

 

 

・○○.select(‘取得条件’)

取得条件に一致したデータをすべて取得する。(CSSセレクタを用いて取得)

import requests
from bs4 import BeautifulSoup

url = requests.get('http://umano-ie.com/racesample/')
soup = BeautifulSoup(url.text, "html.parser")

getdata = soup.select('a[href ="http://umano-ie.com/"]')
print(getdata)

#実行結果
[<a class="site-name site-name-text-link" href="http://umano-ie.com/" itemprop="url"><span class="site-name-text" itemprop="name about">うまのいえ</span></a>, <a class="site-name site-name-text-link" href="http://umano-ie.com/" itemprop="url"><span class="site-name-text" itemprop="name about">うまのいえ</span></a>]

 

実行結果が不格好なので、整形する必要がありますが、指定したタグ等でデータ取得できたことはお見せできました。

Webスクレイピング対象のHTML構造を確認し、BeautifulSoupのメソッドを活用しつつ、タグやCSSに紐づいた情報を取得する。これがWebスクレイピングの基本的な流れになります。

 

 

まとめ

BeatifulSoup の文法とパサーの説明をさせていただきました。

今回、メソッドは一部だけの紹介となりましたが、BeatifulSoupへの理解が深まれば、スクレイピングの幅もぐっと広がります。これを機に、学習を掘り下げてみてはいかがでしょうか。

 

「うまのいえ」では、今後もWebスクレイピングのネタを中心にブログを更新していきます。

また、足を運んでいただけると喜びます。

 

ご清聴ありがとうございました。