WEBスクレイピングのためのBeautifu Soup4の使い方(基本)

  • Beautifu Soup4ってなに?
  • Beautifu Soup4の使い方が知りたい。

と思う方が多いと思います。
この記事では、WEBスクレイピングでよく使用されるBeautifu Soup4の使い方をまとめていこうと思います。

WEBスクレイピングとは

WEBスクレイピングは、WEB上のホームページを解析し、情報を抽出することです。

WEBスクレイピングを行う目的は以下のようなものがあります。

  • 大幅に時間を削減できる。
  • 作業を自動化出来る。
  • 自分の必要な情報だけを自動的に入手することが出来る。

商品情報や市場調査など、自分が知りたい情報だけを素早く自動的に取得することが出来ます。

WEBスクレイピングをする際の注意点

なんかWEBサイトから勝手に情報を集めるようなことって問題にならないの?と思った人もいると思います。

これは、基本的には問題ありません!

ただし、 利用規約等で明確に禁止しているサイトもあります(例:Twitterなど)

そういったサイトに対してWEBスクレイピングをしてしまうと、最悪訴えられます!

WEBスクレイピングをする際は事前に利用規約を確認し、問題ないことを確認してから実行するようにしましょう。

Beautifu Soup4とは

Beautifu Soup4はPythonのHTML/XML解析用ライブラリです。 これは使ってみるのがわかりやすいと思うので、実際使っていきましょう。

Beautifu Soup4のインストール

コマンドラインから、pipよりBeautifu Soup4をインストールしてください。

pip install bs4

特に問題なくインストールできると思います。

Beautifu Soup4を使ってみる

HTMLの取得

まずは基本から。 以下のようなファイルを作成し、 コマンドラインにて実行してみる。

from bs4 import BeautifulSoup


html = """
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title>bs4test</title>
</head>
<body>
	<h1>hogehoge</h1>
</body>
</html>
"""

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

html変数にHTML文を定義し、BeautifulSoupにてHTMLを解析後、標準出力を行っている。
このように、取得したHTMLを出力することができる。

ファイルからHTMLの取得

次に、ファイルから取得してみる。 先程と同じ内容のHTMLファイルを作成する。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title>bs4test</title>
</head>
<body>
	<h1>hogehoge</h1>
</body>
</html>

Pythonファイルと同じ階層に配置し、以下のファイルを実行する。

from bs4 import BeautifulSoup

with open("bs4_test.html","r") as file: # ★変更箇所
    html = file.read() # ★変更箇所

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

withを使用することでファイルの中身を取得できる。
ファイルの中身を取得した後に、BeautifulsoupでHTML文を解析(取得)している。

これを実行することで
ファイルに定義したHTML文が取得でき、標準出力に出力できていることがわかる。

出力結果

ファイルからHTML内の特定タグの取得(単体)

HTML内の指定したタグを抽出する。 先程のHTML文から、「h1」タグを取得してみる。

from bs4 import BeautifulSoup

with open("bs4_test.html","r") as file:
    html = file.read()

soup = BeautifulSoup(html, "html.parser")
print(soup.find("h1")) # ★変更箇所

「print(soup.find(“h1”))」の部分で
find関数内でタグ名を指定し、取得している。

実行すると「h1」タグが取得できる。

出力内容

<h1>hogehoge</h1>

以下のように第二引数を指定することでプロパティを指定することも出来る。

print(soup.find(“meta”, {“charset”: “utf-8”}))

出力内容

<meta charset=”utf-8″/>

ファイルからHTML内の特定タグの取得(複数)

HTML内の指定したタグを 複数 抽出する。 複数抽出する場合は「find_all」を使用する。 戻り値はリスト(複数)となるため、for文などで処理を行う。

以下のようなHTML、Pythonに変更し、実行してみる。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title>bs4test</title>
</head>
<body>
	<h1>hoge1-1</h1>
	<h2>hoge2-1</h2>
	<h3>hoge3-1</h3>
	<h3>hoge3-2</h3>
	<h2>hoge2-2</h2>
	<h3>hoge3-3</h3>
	<h3>hoge3-4</h3>
</body>
</html>
from bs4 import BeautifulSoup

with open("bs4_test2.html","r") as file:
    html = file.read()

soup = BeautifulSoup(html, "html.parser")
print(soup.find("h2"))
print(soup.find_all("h3"))

h3s = soup.find_all("h3")
for h3 in h3s :
    print(h3)

出力結果

h2タグは「find」。h3タグは「find_all」を使用。
見てわかるように、findは 最初に見つかった1件 を出力するのに対し、find_allはすべてのタグを配列で出力している。

さらに取得した配列データをfor文で回すことで一つのタグ毎に処理を実行することが出来る。

特定WEBサイト上の情報を抜き出す

特定のWebサイトの情報を抽出する際は、以下のように「requests」ライブラリを使用する。

インストールをしておいてください。

pip install requests

from bs4 import BeautifulSoup
import requests # 変更箇所

result = requests.get("https://1kara-hajimeru.com/") # 変更箇所

soup = BeautifulSoup(result.text, "html.parser") # 変更箇所

links = soup.find_all("a") # 変更箇所
for link in links : # 変更箇所
    print(link) # 変更箇所

解析したいページのURLを覚えておき、requests.getで、ページ情報を取得します。

今回はホームページから複数のaタグ(リンク)を取得しました。
リンクの一覧が取得できていることがわかります。

見やすいHTMLの出力

WEBサイトによっては、わかりにくくするためわざとインデントや空白を入れないようにしているサイトがあります。

そんなサイトのHTMLを見やすくするために、「prettify」関数が用意されています。

from bs4 import BeautifulSoup

html = """
<!DOCTYPE html><html><head><meta charset="utf-8"/>
<title>bs4test</title></head><body><h1>hogehoge</h1>
</body></html>
"""

soup = BeautifulSoup(html, "html.parser")
print(soup.prettify())

HTMLをわざと見づらくしていますが、prettifyを使用することで見やすく出力されます。

取得した情報の出力

Beautifu Soup4にて取得した情報をファイルなどに出力したいと思う方もいるのではないでしょうか。

出力する際は、以下のような方法があります。 出力方法については、別の記事でまとめようと思います。

  • CSV出力
  • Excel出力
  • データベース出力

次は、、、

今回はBeautifu Soup4の基礎としてHTML情報の抽出方法をまとめました。

いかがでしたでしょうか。 かなり簡単にWEBサイトの情報を抽出できたと思いませんか。

是非、BeautifulSoupを使って、WEBスクレイピングをやってみてください。

出力方法や応用編としての使い方はまた別の記事でまとめたいと思います。

以上。