目次
開発環境
- Python version: python 3.10.11
- beautifulsoup4: 4.11.1
PythonのBeautiful Soupとは
Beautiful Soup(ビューティフル・スープ)とは、HTMLやXMLなどのマークアップ言語からデータを抽出するためのPythonのライブラリです。
Beautiful Soupは、パース(解析)されたHTMLやXMLのドキュメントをセレクタやフィルタなどの機能で特定の要素やデータを抽出することができるため、簡潔で効率的な方法でデータを抽出できます。
また、Beautiful Soupは、外部ライブラリのlxmlやhtml5libと組み合わせて使用されることが一般的で、これらのライブラリを組み合わせてWebスクレイピングやデータ収集などのタスクに広く使用されています。
公式ドキュメント:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#
PythonのBeautiful Soupの使い方
PythonのBeautiful Soupの使い方を解説していきます。
Beautiful Soupをインストール
Beautiful Soupをインストールするにはpipコマンドを使用します。
1 | pip install beautifulsoup4 |
また、データの取得にはPythonではRequestsを利用することは一般的なため、インストールされていない方は下記のコマンドも実行してください。
1 | pip install requests |
これで準備完了です。
PythonのBeautiful Soupでスクレイピングする
次にPythonのBeautiful Soupでスクレイピングするサンプルコードを解説しています。
スクレイピングのサンプルコード
下記はBeautiful Soupを使用してYahoo!JAPANのトップページにリクエストを送り、TopicsからタイトルとURLの一覧を取得するサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import requests from bs4 import BeautifulSoup # スクレイピング対象の URL にリクエストを送り HTML を取得する res = requests.get('https://www.yahoo.co.jp/') # レスポンスの HTML から BeautifulSoup オブジェクトを作る soup = BeautifulSoup(res.text, 'html.parser') # Topicsの要素を取得する elements = soup.select('#tabpanelTopics1 > div > div._2jjSS8r_I9Zd6O9NFJtDN- > ul > li') # リストから要素を取り出し、その後にtext属性を使用してテキストを取得 for element in elements: title_text = element.select_one('h1').text title_url = element.select_one('a')['href'] print("------------------------") print(title_text) print(title_url) |
Yahoo JapanのトップページにGETリクエストを送る
Yahoo JapanのトップページにGETリクエストを送ります。
1 | res = requests.get('https://www.yahoo.co.jp/') |
その結果として得られるHTMLを取得し、変数res
に代入しています。
HTMLドキュメントを解析する
次にHTMLドキュメントを解析しています。
1 | soup = BeautifulSoup(res.text, 'html.parser') |
取得したHTMLをBeautiful SoupのBeautifulSoupオブジェクトにパースすることにより、HTMLドキュメントを解析して要素を抽出しやすくなります。
CSSセレクタで要素を抽出する
CSSセレクタで要素を抽出します。
1 | elements = soup.select('#tabpanelTopics1 > div > div._2jjSS8r_I9Zd6O9NFJtDN- > ul > li') |
Yahoo Japanトップページのトピックスの部分をBeautifulSoupのselectメソッドを使用して、指定されたCSSセレクタに一致する要素を抽出しています。
各トピックスの要素からタイトルとURLを取得する
最後に各トピックスの要素からタイトルとURLを取得します。
1 2 3 4 5 6 | for element in elements: title_text = element.select_one('h1').text title_url = element.select_one('a')['href'] print("------------------------") print(title_text) print(title_url) |
select_oneメソッドを使用して、CSSセレクタに一致する最初の要素を取得し、その後、text属性や属性値を取得しています。
ループ内のelement.select_one('h1').text
はタイトル、element.select_one('a')['href']
はURLを取得しています。
おわりに
今回はPythonでBeautifulSoupを使ったスクレイピングの方法について解説していきましたが、いかがだったでしょうか。
WebスクレイピングはSeleniumが有名ですが、HTMLやXMLのドキュメントを解析することが得意なBeautifulSoupと組み合わせることにより、非常に効率的にデータを収集することができます。
Webスクレイピングの需要は年々高まっているため、是非、使いこなしていきましょう。