第30回「スクレイピング(2)」PythonとBeautifulSoupでHTMLを解析

こんにちは、小澤です。

前回は、スクレイピングとは何か、そしてどのような場面で役に立つのかを紹介しました。今回は実践をはじめる準備として、PythonとBeautifulSoupを使ってHTMLを解析するところまでを紹介しましょう。

スクレイピングは「画面を見て情報を抜き取る作業」ではなく、HTMLというテキスト構造を読み解き、そこから情報を抜き出す作業です。つまり、スクレイピングを行ううえでは、HTMLの構造を理解することが避けて通れません。よって、今回は、

  • HTMLはどんな構造をしているのか
  • PythonでWebページを取得すると何が手に入るのか
  • BeautifulSoupは何をしてくれるのか

を確認しながら、スクレイピングをする感覚を実感してもらうことにします。

教科書『Pythonによる新しいデータ分析の教科書(第2版)』では「スクレイピング」(274ページ〜284ページ)の箇所です。

HTMLは「タグでできた構造データ」

まず押さえておきたいのは、Webページの中身です。私たちが普段ブラウザで見ているWebページは、内部的には HTMLで構成されています。HTMLは、見た目を指示するものというより、「この部分は見出し」「ここは本文」「ここはリンク」といった意味や役割をタグで表現する構造化文書といえます。

以下はシンプルなHTMLの例です。

<html>
<body>
<h1>商品一覧</h1>
<p class=”price”>価格:1000円</p>
</body>
</html>

このHTMLでは、

  • <h1> は見出し
  • <p> は段落
  • class=”price” は要素につけられた属性

を表しています。

さらに重要なのは、HTMLが入れ子(ネスト)構造になっている点です。<html> の中に <body> があり、その中に <h1> や <p> が並んでいます。このように、HTMLはツリー(木)構造として意味を持つデータになっていることが分かります。この構造を手がかりに「どのタグか」「どのような属性を持っているか」「どの位置にあるか」といったことを指定して情報を取り出します。

PythonでWebページを取得すると「文字列」が取得できる

では、さきほどのHTMLをPythonで取得するとどうなるのでしょうか。ここでは、HTTP通信を行うための代表的なライブラリである requests を使います。

import requests

url = “[<https://example.com>](<https://example.com/>)”
response = requests.get(url)
html = response.text

print(html)

このコードを実行すると、Webページの中身であるHTMLがずらっと表示されます。その表示されたテキストは、HTMLそのものを文字列として表示しているだけです。つまり、この時点では、「どこが見出しか」「どこが価格か」「どの部分が意味を持つ要素か」といったことを解釈できているわけではありません。つまり、これは、ただの長い文字列です。この文字列を、文字列操作を駆使して情報を抜き出そうとしても、文字列検索が複雑になったり、HTML構造が変わると壊れてしまったりといった問題が出てきます。

そこで登場するのが BeautifulSoup です。

BeautifulSoupは「HTMLを構造として扱う」ための道具

BeautifulSoupは、HTMLを解析し、タグ構造を保ったままPythonで扱えるようにするライブラリです。先ほど取得したHTML文字列を、BeautifulSoupに渡してみましょう。

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, “html.parser”)

これだけで、soup というオブジェクトが、

  • htmlタグ
  • bodyタグ
  • h1タグ
  • pタグ

といったHTML要素を構造的に理解した状態になります。これが、スクレイピングの第一歩です。ちなみに、BeautifulSoupの第2引数は「どのパーサ(解析エンジン)を使うか」です。今回は、Python標準の解析エンジンを使う指定です。

タグを指定して情報を取り出す

次に、たとえば、ページ内の <h1> タグの内容を取得したい場合は、次のように書きます。

title = soup.find(“h1”)
print(title.text)

このコードだけで、<h1> タグを探し、その中のテキストだけを取り出す、という処理が実現できます。これは、HTML構造を理解しているからこそ、「h1という意味を持つ要素」を直接指定して操作できるということです。さらに、属性を指定することもできます。

price = soup.find(“p”, class_=”price”)
print(price.text)

これは、class=”price” を持つ <p> タグを探し、その中のテキストを取得するコードです。HTML構造を読み、Pythonで要素を指定するとデータが取得できるという流れが見えてきたのではないでしょうか。

重要なのは「HTML→BeautifulSoup」の変換

流れを整理すると以下のようになります。

  • Webページを取得する(requests)
  • HTMLを文字列として受け取る
  • BeautifulSoupでHTMLを解析する
  • タグや属性を指定して情報を抜き出す

BeautifulSoupは、HTML構造を前提に、タグや属性を指定して、そこにある情報を取り出すための補助ツールです。

よって、

  • どんなタグが使われているか
  • どこに属性が付いているか
  • 要素がどのように並んでいるか

を解釈することが、スクレイピングの精度につながります。

今回のまとめ

今回は、PythonとBeautifulSoupを使ってHTMLを解析するまでの流れを確認しました。ポイントは次です。

  • スクレイピングはHTML構造を読む作業
  • Pythonで取得したHTMLは最初はただの文字列
  • BeautifulSoupを使うことでHTMLを構造として扱える
  • タグや属性を指定すると情報を抜き出せる

次回は、この基本的な流れを踏まえたうえで、CSSセレクタやXPathを使って、欲しい情報を正確に取得する方法を解説することにします。BeautifulSoupのよくある使い方についても紹介したいと思います。次回もお楽しみに。

PAGE TOP