(1時間4,000円の伴走型ビデオチャット指導も受付中!)
PythonでWeb情報を優しく集める:BeautifulSoup入門講座
![]()
【Hiroki】
Yukiさん、こんばんは。今日も遅くまで作業されているんですね。
最近、インターネット上のたくさんのニュース記事から、タイトルだけを効率よく集めたいと思っているんです。でも、一つずつコピーして回るのは現実的じゃなくて……。Pythonを使って、自動で情報を抜き出す方法があると聞いたのですが、教えていただけますか?
![]()
【Yuki】
Hiroki君、こんばんは。ふふ、夜は静かで集中しやすいですから……わたしは今の時間の方が落ち着くんです。
インターネットから情報を自動で集める技術は「Webスクレイピング」と呼ばれています。Pythonには、そのためのとても強力で、かつ初心者の方にも優しいライブラリがあるんですよ。
それが、BeautifulSoup(ビューティフルスープ)です。
今日は、このライブラリを使ってWebサイトの情報を解析する方法について、一緒に見ていきましょうか。
![]()
【Hiroki】
BeautifulSoup、ですか。なんだか美味しそうな名前ですね!
具体的には、どのようなことができるライブラリなんですか?
![]()
【Yuki】
ええ、面白い名前ですよね。
Webページは「HTML」という言葉で書かれています。でも、HTMLは人間がそのまま読むには少し複雑な構造をしているんです。BeautifulSoupは、その複雑なHTMLの中から、自分の欲しい情報だけを「つまみ出す」のを助けてくれるツールだと思ってください。
これを使うと、「この見出しだけを抜き出す」とか「リンクのURLだけを一覧にする」といったことが、驚くほど短いコードで書けるようになるんですよ。
BeautifulSoupを準備しよう
![]()
【Hiroki】
それは便利そうですね!
使い始めるには、何か特別な準備が必要ですか?
![]()
【Yuki】
はい、まずはライブラリをインストールする必要があります。
BeautifulSoup自体と、Webページを取得するための requests というライブラリを一緒に使うのが一般的です。ターミナルやコマンドプロンプトで、次のコマンドを入力してみてください。
pip install beautifulsoup4 requests
![]()
【Hiroki】
インストールできました。これで準備完了ですね!
![]()
【Yuki】
はい、準備万端です。
では、まずは一番基本的な使い方を見てみましょうか。HTMLの文字列から、特定の情報を抜き出す練習をしてみましょう。
...ちょっと緊張しますが、コードを書いてみますね。
基本的な解析の流れ
![]()
【Yuki】
まず、解析したいHTMLデータを用意して、それをBeautifulSoupに読み込ませます。
以下のコードをエディタに入力してみてください。
from bs4 import BeautifulSoup
# 解析したいHTML(本来はWebから取得しますが、まずは練習用に文字列で用意します)
html_doc = """
<html>
<head>
<title>Yukiの小さな図書室</title>
</head>
<body>
<h2 class="title">Pythonプログラミング入門</h2>
<p class="description">BeautifulSoupを使ってスクレイピングを学びましょう。</p>
<a href="https://example.com/course/1" class="link">コース詳細はこちら</a>
<a href="https://example.com/course/2" class="link">次のステップへ</a>
</body>
</html>
"""
# BeautifulSoupのオブジェクトを作成します
# 第2引数の 'html.parser' は、Python標準の解析器を使うという指定です
soup = BeautifulSoup(html_doc, 'html.parser')
# タイトルを表示してみます
print(soup.title.string)
![]()
【Hiroki】
おぉ、実行したら Yukiの小さな図書室 と表示されました!
soup.title.string だけで、HTMLの中からタイトルの文字だけを抜き出せるんですね。
![]()
【Yuki】
そうなんです。
soup というオブジェクトの中に、HTMLの構造が整理されて格納されているので、ドット(.)でつなぐだけで直感的にアクセスできるんですよ。
でも、実際のWebサイトはもっと複雑です。特定のクラス名がついた要素や、たくさんの同じタグの中から特定のものを探す必要がありますよね。
特定の要素を探す:find() と find_all()
![]()
【Hiroki】
確かに、一つのページには <h2> や <a> タグがたくさんありますよね。
それらを区別して取得するにはどうすればいいんでしょうか?
![]()
【Yuki】
そこで使うのが、find() と find_all() というメソッドです。
find() は条件に合うものを「最初の一つだけ」探し、find_all() は「すべて」探してリスト形式で返してくれます。
# class属性が "title" である h2タグを探す
title_tag = soup.find("h2", class_="title")
print(f"見出し: {title_tag.text}")
# 全ての aタグを探す
links = soup.find_all("a")
for link in links:
print(f"リンクテキスト: {link.text}")
![]()
【Hiroki】
なるほど! class_ のように、属性を指定して絞り込めるんですね。
……でも、どうして class ではなく class_ とアンダースコアがついているんですか?
![]()
【Yuki】
ふふ、いいところに気づきましたね。
Pythonでは class という言葉が、プログラムの構造を作るための予約語として既に使われているんです。それと区別するために、BeautifulSoupではあえて class_ と書く決まりになっているんですよ。
ちょっとした工夫ですが、大切なポイントです。
属性の値を取り出す
![]()
【Hiroki】
属性の絞り込み方はわかりました。
でも、リンクのテキストだけじゃなくて、リンク先のURL、つまり href の中身を知りたいときはどうすればいいんでしょう?
![]()
【Yuki】
タグの中にある属性の値を取り出すには、辞書のように扱うのが一番簡単だと思います。
やってみましょうか。
# 最初のaタグを取得
first_link = soup.find("a")
# href属性の値を取り出す
url = first_link["href"]
print(f"URL: {url}")
![]()
【Hiroki】
あ、本当に辞書みたいですね! link["href"] で中身が取れるなんて。
これなら、画像タグの src 属性なんかも簡単に抜き出せそうです。
![]()
【Yuki】
その通りです。Hiroki君、飲み込みが早くて助かります……。
特定の属性があるかどうか不安なときは、get() メソッドを使うのも安全かもしれませんね。
たとえば link.get("href") と書けば、もし属性がなくてもエラーにならずに None を返してくれます。
CSSセレクタを使った高度な検索
![]()
【Hiroki】
もっと複雑な、例えば「特定のIDを持った要素の中にある、特定のクラスのリンク」みたいに、階層が深いものを探すのは大変じゃないですか? find を何度もつなげるのは少し読みづらくなりそうで。
![]()
【Yuki】
そうですね。そういうときは、CSSセレクタという仕組みを使うのがとても便利です。
Webデザインなどでスタイルを当てるときに使う書き方を、そのまま検索条件にできるんですよ。
BeautifulSoupでは、select_one() と select() を使います。
# id="main" の中にある class="item" の要素をすべて取得するイメージ
# (今回の練習用HTMLにはありませんが、書き方の例です)
# items = soup.select("#main .item")
# 練習用HTMLで、class="link" を持つ aタグをすべて取得
links = soup.select("a.link")
for link in links:
print(f"セレクタで取得: {link.text}")
![]()
【Hiroki】
CSSセレクタが使えると、検索の自由度がぐっと上がりますね!
Webサイトの構造を解析するときは、ブラウザのデベロッパーツールでコピーしたセレクタをそのまま使えそうです。
![]()
【Yuki】
はい、その使い方はとても効率的だと思います。
……ただ、あまり複雑なセレクタに頼りすぎると、Webサイトのデザインが少し変わっただけで動かなくなってしまうこともあるので、なるべくシンプルで壊れにくい条件を探すのがコツですよ。
実際のWebサイトからデータを取得する
![]()
【Hiroki】
実際にインターネット上のサイトから情報を取ってくる場合、どのようにコードを書けばいいんですか?
![]()
【Yuki】
ここで requests ライブラリの出番です。
Webサイトにアクセスして、その内容をBeautifulSoupに渡す、という流れになります。
例として、あるニュースサイトの情報を想定したコードを書いてみますね。
import requests
from bs4 import BeautifulSoup
import time
url = "https://example.com/news"
try:
# Webページを取得
response = requests.get(url)
# 文字化けを防ぐため、適切なエンコーディングを設定
response.encoding = response.apparent_encoding
# ステータスコードが200(成功)か確認
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
# 記事のタイトル一覧を取得(サイトの構造に合わせる必要があります)
articles = soup.find_all("h3")
for i, article in enumerate(articles, 1):
print(f"記事{i}: {article.text.strip()}")
else:
print(f"エラーが発生しました。ステータスコード: {response.status_code}")
except Exception as e:
print(f"接続中にエラーが発生しました: {e}")
![]()
【Hiroki】
requests.get(url) でページ全体を読み込んで、その text をBeautifulSoupに渡せばいいんですね。
article.text.strip() の strip() は何のために使っているんですか?
![]()
【Yuki】
HTMLの中には、目に見えない改行や空白がたくさん含まれていることが多いんです。
そのまま出力すると余計なスペースが入ってしまうので、strip() を使って前後の空白を綺麗に取り除いています。
こういった、ちょっとした気遣いでデータがぐっと見やすくなるんですよ。
Webスクレイピングの大切なマナーとルール
![]()
【Hiroki】
よし、これで自分の好きなサイトの情報をどんどん集められそうです!
さっそく、いくつか大きなサイトを対象にプログラムを回してみようかな。
![]()
【Yuki】
……Hiroki君、少し待ってください。
Webスクレイピングには、守らなければならない大切なマナーとルールがあるんです。
これを無視してしまうと、相手のサーバーに負担をかけてしまったり、最悪の場合は法律に触れてしまうこともあるんですよ。
![]()
【Hiroki】
えっ、法律ですか……? ただ情報を読み取っているだけなのに。
![]()
【Yuki】
はい。短時間に何千回、何万回とアクセスすると、相手のサーバーが攻撃を受けていると判断して止まってしまうかもしれません。
また、サイトの利用規約でスクレイピングを禁止しているところもあります。
以下の点は、必ず守るようにしてくださいね。
- アクセス頻度を下げる: 1回の取得ごとに、最低でも1秒以上の間隔を空けるようにしてください。Pythonでは
time.sleep(1)を使います。 - robots.txtを確認する: サイトのルートディレクトリ(example.com/robots.txt など)にあるファイルで、機械的な収集が許可されているか確認しましょう。
- 著作権に注意する: 取得したデータを自分のものとして公開したり、販売したりするのは著作権法に触れる可能性があります。あくまで個人で楽しむ範囲に留めてくださいね。
- サーバーに負荷をかけない: 大量のデータを一度に取ろうとせず、本当に必要な情報だけを絞って取得するように心がけてください。
![]()
【Hiroki】
なるほど……。便利な道具だからこそ、相手への思いやりを持って使わないといけないんですね。
勉強になります。
![]()
【Yuki】
ええ、本当にその通りだと思います。
わたしも、誰かが作ってくれた大切なWebサイトを扱うときは、いつも「お邪魔します」という気持ちでアクセスするようにしています……。
小さなツールであっても、誰かの役に立ったり、自分の世界を広げたりするために正しく使いたいですよね。
困ったときは公式サイトを確認しよう
![]()
【Hiroki】
BeautifulSoupについて、基本がしっかり理解できた気がします!
もっと詳しい使い方や、特殊なケースの対処法を知りたくなったら、どこを見ればいいでしょうか?
![]()
【Yuki】
一番の近道は、やっぱり公式ドキュメントを読むことですね。
英語が基本ですが、有志の方による日本語訳も用意されています。
困ったときは、こちらのリンクを覗いてみてください。
![]()
【Hiroki】
ありがとうございます!
まずはマナーを守りながら、簡単なニュースサイトのタイトル集めから挑戦してみます。
![]()
【Yuki】
はい、応援しています。
もしコードがうまく動かなくて、フォントやレイアウトが崩れた画面をずっと見つめて疲れてしまったときは、一度目を休めてくださいね。
夜はまだ長いですし、自分のペースでゆっくり学んでいきましょう。
![]()
【Hiroki】
はい! またわからないことがあったら教えてください。
![]()
【Yuki】
ええ、喜んで。
……あ、今の解説、わかりやすかったでしょうか?
もし少しでもHiroki君の役に立てたなら、わたしも嬉しいです。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

