こんにちは、小澤です。
前回は、スクレイピングとは何か、そしてどのような場面で役に立つのかを紹介しました。今回は実践をはじめる準備として、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のよくある使い方についても紹介したいと思います。次回もお楽しみに。
