Pythonでウェブスクレイピング!BeautifulSoup入門
ウェブサイトから情報を抽出したいと思ったことはありませんか?ニュース記事のタイトルを一覧にしたり、商品の価格を比較したり…。そんな時に役立つのが「ウェブスクレイピング」です。Pythonには、ウェブスクレイピングを簡単に行える便利なライブラリがたくさんありますが、今回はその中でも特に初心者におすすめの「BeautifulSoup」についてご紹介します。
BeautifulSoupって何?
BeautifulSoupは、HTMLやXML形式のドキュメントを解析するためのPythonライブラリです。複雑なウェブページの構造を解析し、特定の情報を効率的に抽出することができます。BeautifulSoupを使うことで、ウェブページのソースコードを文字列として扱うよりも、ずっと簡単に目的のデータにアクセスできるようになります。
例えるなら、ウェブページのソースコードがぐちゃぐちゃに積み上げられたブロックだとすると、BeautifulSoupはそのブロックを整理整頓し、探しているブロック(情報)を簡単に見つけ出せるようにしてくれる、そんな魔法のツールです。
BeautifulSoupを使うための準備
BeautifulSoupを使うには、まずインストールが必要です。ターミナルやコマンドプロンプトで以下のコマンドを実行してください。
pip install beautifulsoup4
BeautifulSoup単体では動作しません。HTMLやXMLを解析するために、パーサーと呼ばれるものが必要です。Pythonに標準で付属しているhtml.parser
を使うこともできますが、より高速で柔軟なlxml
やhtml5lib
といったパーサーもおすすめです。
pip install lxml # または pip install html5lib
BeautifulSoupの基本的な使い方
それでは、実際にBeautifulSoupを使ってウェブページを解析してみましょう。
まずは、解析したいウェブページのHTMLを取得します。今回は、簡単なサンプルHTMLを文字列として用意します。
html_doc = """
<html><head><title>BeautifulSoup入門</title></head>
<body>
<h1>ウェブスクレイピングを始めよう</h1>
<p class="description">BeautifulSoupは使いやすいライブラリです。</p>
<a href="https://example.com">もっと詳しく</a>
</body></html>
"""
次に、BeautifulSoupオブジェクトを作成します。この際に、使用するパーサーを指定します。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser') # または 'lxml', 'html5lib'
soup
は、解析されたHTMLドキュメント全体を表すオブジェクトです。ここから様々な方法で情報を抽出できます。
情報抽出の基本
1. タグ名で要素を取得する
最も基本的な方法は、タグ名を指定して要素を取得することです。
title_tag = soup.title
print(title_tag) # <title>BeautifulSoup入門</title>
print(title_tag.text) # BeautifulSoup入門
soup.title
のように、タグ名を属性としてアクセスすると、最初に見つかったそのタグの要素が返されます。.text
を使うと、タグの中身のテキストを取得できます。
2. find()とfind_all()を使う
特定の条件に合致する要素を探すには、find()
とfind_all()
が便利です。
find()
: 最初に見つかった要素を返します。find_all()
: 条件に合致する全ての要素をリストとして返します。
h1_tag = soup.find('h1')
print(h1_tag) # <h1>ウェブスクレイピングを始めよう</h1>
p_tag = soup.find('p', class_='description') # class属性がdescriptionのpタグ
print(p_tag) # <p class="description">BeautifulSoupは使いやすいライブラリです。</p>
print(p_tag.text) # BeautifulSoupは使いやすいライブラリです。
a_tags = soup.find_all('a')
for a_tag in a_tags:
print(a_tag['href']) # https://example.com
find()
やfind_all()
では、タグ名だけでなく、属性を使って検索することもできます。例えば、class_='description'
は、class
属性がdescription
である要素を探します。複数の属性を指定することも可能です。
3. CSSセレクタを使う
CSSセレクタを使って要素を検索することもできます。これは、ウェブ開発の知識がある方には馴染み深いかもしれません。
h1_tag = soup.select_one('h1') # 最初に見つかったh1タグ
print(h1_tag.text) # ウェブスクレイピングを始めよう
p_tags = soup.select('p.description') # classがdescriptionのpタグ
for p_tag in p_tags:
print(p_tag.text) # BeautifulSoupは使いやすいライブラリです。
select_one()
は最初に見つかった要素を返し、select()
は条件に合致する全ての要素をリストとして返します。
まとめ
BeautifulSoupは、ウェブスクレイピングを始めるための強力なツールです。今回紹介したのはほんの基本的な使い方ですが、これだけでも多くのウェブページから必要な情報を抽出できるようになります。
さらに深く学ぶためには、BeautifulSoupの公式ドキュメント(https://www.crummy.com/software/BeautifulSoup/bs4/doc/)を参照することをおすすめします。
ウェブスクレイピングを行う際には、ウェブサイトの利用規約を遵守し、過度なアクセスは避けるようにしましょう。倫理的な利用を心がけて、ウェブスクレイピングを楽しみましょう!
コラム一覧
◯for文
◯関数
◯配列
◯文字列
◯正規表現
◯ファイル入出力
◯openpyxl
◯Numpy
◯Matplotlib
◯Pandas
◯scikit-learn
◯seaborn
◯beautifulsoup
◯tkinter
◯OpenCV
◯pygame
◯メイン関数
◯自作ライブラリ
◯画像処理
◯機械学習
◯スクレイピング
◯データ分析
◯グラフ作成
◯API
◯可読性
◯デバッグ
◯例外処理
◯コメント
◯組み込み関数
◯flask
◯学び方
◯ビット演算
◯マルチスレッドプログラミング
◯参照渡し
◯pyenv
◯エディタ
◯生成AI
◯画像認識
◯Streamlit
◯lambda式
◯物理演算シミュレーション
◯命名規則
◯遺伝的アルゴリズム
◯関数型プログラミング
◯オブジェクト指向
◯ツリー図