【Python】BeautifulSoupでWebスクレイピングに挑戦|HTML解析の基礎を徹底解説

当ページには広告が含まれています。

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

サマリー
  • Webスクレイピングとは、プログラムを用いてWebからコンテンツデータを取得すること。
  • 本記事ではBeautifulSoupを用いたスクレイピング手法について徹底解説。
目次

【Python】Webスクレイピングとは

Webスクレイピング(Web Scraping)とは、WebサイトのHTMLからデータを抽出する技術を指します。この技術をもとに、Web上のテキストや画像データを抽出できます。Webスクレイピングのメリットは短時間で多量な情報収集ができる点です。

【参考】Webスクレイピングについて詳しく学ぶ

Pythonライブラリ|BeautifulSoupとは

Beautiful Soupとは、Webサイトを構築するHTMLやXMLを取得するためのモジュールです。

本記事ではBeautifulSoupを用いたPythonプログラミングをもとに、HTMLファイルをパース(構文解析)し、必要なデータを取得する方法を解説します。

【事前準備】BeautifulSoupをインストール

BeautifulSoupのモジュール名は、BeautifulSoupバージョン4になります。インストール未済の場合は、コマンドラインから下記を入力しインストールしましょう。

pip install beautifulsoup4

【Python】BeautifulSoupを用いたWebスクレイピング手順

  1. PythonでBeautifulSoupのオブジェクト作成
  2. HTML要素の中から目的のHTML要素を見つける
  3. HTML要素に対して画像・テキスト・リンク取得メソッドを指定し、目的のデータを取得する
  4. 取得したデータはPandas DataFrameで整理することが多い

Webスクレイピングの実行手順を上図に示します。これはBeautifulSoupのみならず、Webスクレイピング全般として当てはまるプロセスと言えます。

プロセスは非常にシンプルですね!プログラム実行環境を開き、まず、①HTML解析するためのオブジェクトを生成します。続いて、②取得したいHTML要素を見つけ出し、③見つけたHTML要素からデータを抽出するという3ステップです。

【参考】find()メソッドを用いたHTML要素の探索手法

目的のHTML要素を見つける場合、find()メソッドまたはselect()メソッドが頻繁に用いられます。(今回はfind()メソッドを例に紹介)

find()メソッドは「指定したHTML要素の先頭要素のみ渡すfind()メソッド」と「指定したHTML要素をリストで全て渡すfind_all()メソッド」の2つがあります。以下それぞれの違いについて解説します。

find()メソッドとfind_all()メソッドの違い

メソッド 概要 引数部分の記述方法
find_all() 指定した全要素をリストで渡す find_all(“要素名”, {“属性”:”キーワード”})
find() 指定した要素の先頭要素のみ渡す find(“要素名”, {“属性”:”キーワード”})

findメソッドを用いた記述例

Find()メソッドに渡す要素 マッチする対象要素
Bs_Obj.find_all(“div”) 全てのdiv要素
Bs_Obj.find(“div”) 先頭のdiv要素
Bs_Obj.find(id=”XXXX”) id属性がXXXXである要素
Bs_Obj.find_all(class_=”XXXX”) class属性がXXXXである全要素
Bs_Obj.find(class_=”XXXX”) class属性がXXXXである先頭要素
Bs_Obj.find_all(“table”,{“class”:”XXXX”}) class属性がXXXXである全table要素
Bs_Obj.find_all(“input”,{“type”:”button”}) type属性がbuttonである全input要素

※Bs_Obj: BeautifulSoupのオブジェクト

HTML要素からデータを取得する方法

続いて、HTML要素からデータ取得する方法を解説します。

getText()・find()メソッドでテキストデータ取得

各メソッドを用い、下記pタグ要素内のテキストデータを取得する場合を解説します。各メソッドの違いを理解しましょう。

<p>他のブログは<a href="https://di-acc2.com">こちら</a></p>
メソッド HTML要素からテキスト取得方法 出力結果
find(text=True) .find(“p”).find(text=True) “他のブログは”
find_all(text=True) .find(“p”).find_all(text=True) [“他のブログは”,”こちら”]
getText() .find(“p”).getText() “他のブログはこちら”
  • find(text=True):指定した要素(pタグ)から次の要素(aタグ)までに存在するテキストデータを取得
  • find_all(text=True):指定した要素(pタグ)のテキストデータを全て取得。ただし、途中で異なる要素(aタグ)がある場合、リストに分けて出力
  • getText():指定した要素(pタグ)のテキストデータを全て取得

get()メソッドでハイパーリンク取得

ハイパーリンクを取得する場合、get()メソッドを用います。

メソッド 使用例 概要
get() .get(“href”) ハイパーリンク取得
get() .get(“src”) (主に画像の)リンク取得

【事前準備】BeautifulSoupを用いたPythonプログラミング

ここから具体的なプログラミング方法の解説です。まず、モジュール読込等の事前準備を行います。

モジュール読込

HTML解析に用いるBeautifulSoupモジュールをインポートします。

from bs4 import BeautifulSoup

スクレイピング対象のHTMLの読込

今回のHTML解析では下記のHTML要素をそれぞれ指定し、データ取得を行います。事前にHTMLを読み込んでおきましょう!

html = """
<h2 class="title"> BeautifulSoupを用いたWebスクレイピング学習基礎</h2>
<p>以下のようなことが学習できます。</p>
<ol>
  <li class="list">Webスクレイピングの基礎</li>
  <li class="list">BeautifulSoupの活用方法</li>
</ol>
<p>他のブログは<a href="https://di-acc2.com">こちら</a></p>
"""

【実践】BeautifulSoupを用いたPythonプログラミング

上記で解説したWebスクレイピングの手順に従い、プログラミングを実施します。

BeautifulSoupのオブジェクトを作成

BeautifulSoup()関数にhtmlを渡したオブジェクトを作成します。

Bs_Obj = BeautifulSoup(html, "html.parser")

オブジェクト(Bs_Obj)を実行すると、取得したHTML要素が全て返ってきます。

# 取得結果
# <h2 class="title"> BeautifulSoupを用いたWebスクレイピング学習基礎</h2>
#   <p>以下のようなことが学習できます。</p>
# <ol>
#   <li class="list">Webスクレイピングの基礎</li>
#   <li class="list">BeautifulSoupの活用方法</li>
# </ol>
#   <p>他のブログは<a href="https://di-acc2.com">こちら</a></p>

HTML要素を見つける

BeautifulSoupオブジェクトに対してfind()メソッドを用い、HTML要素を取得します。以下具体例と出力結果を示します。

先頭のpタグ要素を取得

list_element = Bs_Obj.find("p")
# 取得結果
# <p>以下のようなことが学習できます。</p>

タグ要素をリスト形式で全て取得

list_element = Bs_Obj.find_all("p")
# 取得結果
# [<p>以下のようなことが学習できます。</p>, <p>他のブログは<a href="https://di-acc2.com">こちら</a></p>]

class属性が”title”の要素を取得

class_element = Bs_Obj.find_all(class_="title")
# 取得結果
# [<h2 class="title"> BeautifulSoupを用いたWebスクレイピング学習基礎</h2>]

HTML要素からデータを取得する

取得したHTML要素からテキストデータを取得します。以下具体例と出力結果です。

先頭のpタグ要素からテキストを取得

text = Bs_Obj.find("p").find(text=True)


# 取得結果
# '以下のようなことが学習できます。'

最下部のpタグ要素からテキストを取得

text = Bs_Obj.find_all("p")[-1].getText()


# 取得結果
# '他のブログはこちら'

最下部のpタグ要素テキストを取得(別要素に囲まれたテキストはリストに分けて出力)

text = Bs_Obj.find_all("p")[-1].find_all(text=True)


# 取得結果
# ['他のブログは', 'こちら']

aタグ要素のhref属性を指定し、ハイパーリンクを取得

hyperlink = Bs_Obj.find("a").get("href")


# 取得結果
# 'https://di-acc2.com'

【参考】Webスクレイピングをさらに詳しく!

Webスクレイピングはインターネット上のデータを利活用してマーケティング等の多様な分野に応用できる点で優れています。一方で、Webスクレイピング実施時は、法律や規約などいくつか準拠すべき事項があります。このような事項は必ず理解したのち、Webスクレイピングを実施するようにしましょう。下記のリンクにWebスクレイピングの概要をまとめていますので、是非ご覧ください。

より実践的な内容として、実際のサイトを利用してWebスクレイピングを実行した事例も紹介しています。こちらも併せてご覧下さい。

【参考】Pythonで面倒な作業を自動化!手法一挙公開中!

当サイトでは日々面倒な作業をPythonで自動化する方法を多数配信しております。日々の作業が飛躍的効率化できること間違いなしですので、以下気になった記事があれば併せてご覧ください。

【面倒なタスクをPythonで解決!】作業効率化の人気記事一覧




【参考】Pythonとは?・実現できること

最後に

この記事が気に入ったら
フォローしてね!

目次