---
title: "BeautifulSoupとは？pip installと使い方（find・select）を解説【bs4 4.15】"
url: "https://www.issoh.co.jp/tech/details/3018/"
published: 2024-07-10
updated: 2026-09-26
categories: ["Python"]
publisher: "株式会社一創"
---

# BeautifulSoupとは？pip installと使い方（find・select）を解説【bs4 4.15】

**BeautifulSoup（ビューティフルスープ／bs4）**とは、PythonでHTMLやXMLを解析（パース）し、タイトル・リンク・特定のタグの文章などを取り出すためのライブラリです。インストールは`pip install beautifulsoup4`で、パッケージ名の末尾の「4」を落とすとPython 2.7向けの旧版（BeautifulSoup 3.2.2）を探しにいってエラーになります。2026年9月26日時点のPyPI掲載版は4.15.0（2026年6月7日公開）で、Python 3.7以上が必要です。

本記事では、インストール手順、パーサの選び方、find・find\_all・selectの使い分け、requestsと組み合わせたスクレイピングの実践、利用上の注意点を、手元で動くコード付きで解説します。スクレイピングそのものの仕組みや、クローリング・APIとの違い、法務上の注意点は[スクレイピングとは何かを整理した解説記事](/tech/details/13414/)で扱っています。

## まとめ

BeautifulSoupの要点を整理します。

- BeautifulSoup（bs4）とは、PythonでHTML/XMLを解析しデータを抽出できるライブラリ
- インストールは `pip install beautifulsoup4`（「beautifulsoup4」と正確に指定）。requestsと組み合わせて使う
- パーサは標準の`html.parser`でOK。高速処理ならlxml
- 基本は`find`／`find_all`（タグ・属性）と`select`／`select_one`（CSSセレクタ）。クラス検索は`class_`
- スクレイピングは利用規約・robots.txtの確認、アクセス間隔、著作権・個人情報への配慮を忘れずに

以下の章では、インストールから順にコード付きで解説します。まずは標準のhtml.parserで、身近なページのタイトルやリンクを取り出すところから試してください。

## BeautifulSoupとは

BeautifulSoupは、HTMLの文字列を「プログラムで扱える形」に変換し、タグや属性を指定して目的の要素を取り出せるようにするライブラリです。たとえば「ページ内のすべてのリンク」「特定のクラスを持つ見出し」などを、数行のコードで抽出できます。

HTMLを直接文字列処理するのは大変ですが、BeautifulSoupを使えば、タグの階層構造をたどって直感的にデータを取得できます。通常は、Webページを取得する**requests**ライブラリと組み合わせて使います。requestsでHTMLを取ってきて、BeautifulSoupで解析する、という流れが基本です。

## BeautifulSoupのインストール

BeautifulSoupは、pipでインストールします。パッケージ名は**「beautifulsoup4」**です。

```
pip install beautifulsoup4
```

注意点として、**「beautifulsoup4」と正確に指定**してください。「beautifulsoup」とだけ書くと古いBeautifulSoup3が入ってしまうことがあり、これはPython 3系では正しく動作しません。あわせて、Webページを取得するためのrequestsもインストールしておきます。

```
pip install requests
```

必要に応じて、高速なパーサである**lxml**も入れておくと便利です（後述）。

```
pip install lxml
```

## パーサの種類

BeautifulSoupでHTMLを解析するときは、「パーサ（解析器）」を指定します。代表的なものは次の3つです。

- **html.parser**：Python標準で追加インストール不要。手軽に使え、基本的にはこれで十分です。
- **lxml**：高速で、多少崩れたHTMLにも対応しやすい。大量に処理する場合に向きます（別途インストールが必要）。
- **html5lib**：壊れたHTMLにもっとも強いが、動作は遅め（別途インストールが必要）。

迷ったら、まずは標準の`html.parser`を使えば問題ありません。

## BeautifulSoupの基本的な使い方

BeautifulSoupの基本は、HTMLを読み込んで`BeautifulSoup`オブジェクトを作り、そこからメソッドで要素を取り出すことです。次のサンプルHTMLで見ていきます。

```
from bs4 import BeautifulSoup

html_doc = """
<html><head><title>サンプルページ</title></head>
<body>
<p class="story">むかしむかし、3姉妹がいました。
<a href="http://example.com/1" class="sister" id="link1">エルシー</a>、
<a href="http://example.com/2" class="sister" id="link2">レイシー</a>。
</p>
</body></html>
"""

soup = BeautifulSoup(html_doc, 'html.parser')
```

### タグや文字列を取得する

タグ名を指定すると、最初に見つかった要素を取得できます。`.string`は、タグ内の内容が単一の文字列として定まる場合に取得できます。テキストと子タグが混在すると`None`になるため、子孫要素を含むテキスト全体には`.get_text()`を使います。

```
# titleタグの中の文字列を取得
print(soup.title.string)   # サンプルページ

# 最初のaタグを取得（soup.find('a') と同じ）
print(soup.a)

# リンク先（href属性）を取得
print(soup.a.get('href'))  # http://example.com/1
```

### find と find\_all

もっともよく使うのが`find`と`find_all`です。`find`は条件に合う**最初の1つ**、`find_all`は**すべて**を取得します。

```
# 最初のaタグ
first_link = soup.find('a')

# すべてのaタグを取得して、リンク先を順に表示
for link in soup.find_all('a'):
    print(link.get('href'))
```

クラスや属性で絞り込むこともできます。クラスを指定するときは、Pythonの予約語`class`と区別するため**`class_`（末尾にアンダースコア）**を使う点に注意します。

```
# class="story" のpタグをすべて取得
soup.find_all('p', class_='story')

# id="link1" の要素を取得
soup.find(id='link1')
```

### select（CSSセレクタ）

CSSセレクタで指定したい場合は`select`（すべて取得）と`select_one`（最初の1つ）を使います。普段からCSSに慣れている人には直感的です。

```
# CSSセレクタで取得
soup.select_one('title')      # 最初のtitle
soup.select('p.story a')      # p.story の中のaタグをすべて
soup.select('#link1')         # id="link1"
```

このように、**find系（タグ・属性で指定）**と**select系（CSSセレクタで指定）**の2通りがあり、好みや状況に応じて使い分けられます。

## requestsと組み合わせたスクレイピングの実践

実際のWebページを対象にする場合は、requestsでHTMLを取得し、それをBeautifulSoupで解析します。基本の流れは次の通りです。

```
import requests
from bs4 import BeautifulSoup

url = 'https://example.com'
res = requests.get(url, timeout=(5, 30))
res.raise_for_status()  # HTTPエラーステータスなら例外にする

soup = BeautifulSoup(res.content, 'html.parser')

# ページ内のすべてのリンクのテキストとURLを取得
for a in soup.find_all('a'):
    text = a.get_text(strip=True)
    href = a.get('href')
    print(text, href)
```

取得したデータは、CSVファイルに保存できます。集計や加工をしたい場合は、データ分析ライブラリの[pandas](/tech/details/3123/)と組み合わせると、表形式での整形や分析がしやすくなります。

```
import csv

rows = []
for a in soup.find_all('a'):
    rows.append([a.get_text(strip=True), a.get('href')])

with open('links.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['text', 'url'])
    writer.writerows(rows)
```

記事本文のように特定の場所だけ取りたい場合は、その部分を囲んでいるタグやクラスを指定します。後のコードにある`article-content`は説明用のクラス名なので、対象ページに実在するクラス名へ変更してください。ブラウザの「開発者ツール」でHTML構造を確認し、対象のタグ・クラスを調べるのが実践のコツです。

なお、JavaScriptで後から内容が描画されるページは、requestsで取得したHTMLには目的のデータが含まれないことがあります。その場合は、ブラウザを自動操作してページを描画させる[Selenium](/tech/details/4241/)で目的の要素が描画されるまで待機してからHTMLを取得し、それをBeautifulSoupで解析する組み合わせが有効です。

```
# 例：本文がある領域を指定して、段落テキストをまとめて取得
body = soup.find('div', class_='article-content')
if body:
    text = "\n".join(p.get_text() for p in body.find_all('p'))
    print(text)
```

## BeautifulSoupを使う際の注意点

スクレイピングは便利ですが、ルールとマナーを守って行う必要があります。次の点に注意しましょう。

- **利用規約・robots.txtを確認する**：対象サイトがスクレイピングを禁止していないかを必ず確認します。公式のAPIが用意されている場合は、そちらを優先します。
- **サーバーに負荷をかけない**：短時間に大量のリクエストを送らないよう、アクセスの間隔をあけます（例：`time.sleep(1)`で1秒待つ）。
- **著作権・個人情報に配慮する**：取得したデータの利用目的が、著作権や個人情報保護の観点で問題ないかを確認します。
- **HTML構造の変化に備える**：Webページの構造は変わることがあります。要素が取得できなかった場合（`None`が返る場合）に備えて、エラー処理を入れておくと安定します。

```
import time

urls = ['https://example.com/page1', 'https://example.com/page2']
for url in urls:
    res = requests.get(url, timeout=(5, 30))
    res.raise_for_status()
    soup = BeautifulSoup(res.content, 'html.parser')
    # ここで解析処理
    time.sleep(1)  # 1秒あけて次のリクエストへ
```

## よくある質問（FAQ）

### BeautifulSoupのインストールでエラーになるのはなぜ？

原因の一つはパッケージ名の指定ミスです。`pip install beautifulsoup`と「4」を付けずに実行すると、PyPI上の旧版BeautifulSoup 3系（最終版3.2.2、Python 2.7向け）が選ばれ、Python 3ではsetup.py内の`print "..."`が`SyntaxError: Missing parentheses in call to 'print'`になってインストールに失敗します。`pip install beautifulsoup4`と正確に指定してください。

### 「No module named ‘bs4’」と出るときの対処は？

インストール名は`beautifulsoup4`、コード上のimport名は`bs4`で、両者は別の文字列です。インストール済みなのにこのエラーが出る場合は、pipが入れた先と実行中のPythonが別環境になっていることが典型です。スクリプトを動かすのと同じインタプリタで`python -m pip install beautifulsoup4`を実行すると、入れ先がそろいます。仮想環境を使っているなら、有効化してから入れ直します。

### findとfind\_allの違いは？

`find`は条件に合う最初の1つの要素を返し、見つからなければ`None`を返します。`find_all`は条件に合うすべての要素をリストで返し、見つからなければ空のリストです。`find`の戻り値にそのまま`.get_text()`をつなぐと、要素が無いページで`AttributeError`になるため、`if`で`None`を確かめてから使います。

### クラスで要素を探すときの書き方は？

`class`はPythonの予約語のため、末尾にアンダースコアを付けた`class_`を使います。例：`soup.find_all('p', class_='story')`。CSSセレクタに慣れているなら、`soup.select('p.story')`と書いても同じ要素が取れます。

### パーサは何を選べばいいですか？

追加インストールが不要な標準の`html.parser`で十分です。大量のページを処理して速度が欲しい場合は`lxml`、ブラウザと同じ解釈で崩れたHTMLを読みたい場合は`html5lib`を検討します。どちらも`pip install lxml`／`pip install html5lib`で別途入れ、`BeautifulSoup(html, 'lxml')`のように第2引数で指定します。

### BeautifulSoupとSeleniumの違いは？

BeautifulSoupは受け取ったHTML文字列を解析するだけで、ページの取得もJavaScriptの実行もしません。Seleniumはブラウザを自動操作するツールで、JavaScriptで描画された後のページを扱えます。静的なページならrequests＋BeautifulSoupで足り、描画後の内容が必要なときだけSeleniumで取得したHTMLをBeautifulSoupに渡す、という分担が基本です。

### スクレイピングは自由に行ってよいですか？

対象サイトの利用規約とrobots.txtを確認してください。ただし、robots.txtはクローラー向けのアクセス規則であり、取得やデータ利用を許諾するものではありません。公式のAPIがあるならそちらを優先します。アクセス間隔をあけてサーバーに負荷をかけないこと、取得したデータの利用が著作権や個人情報保護の観点で問題ないかを確かめることも重要です。

## 関連記事

- [スクレイピングとは？クローリング・APIとの違いと実装・法務の判断を解説](/tech/details/13414/)
- [Seleniumの使い方｜Selenium 4でWebDriverの手動設定が不要になった書き方](/tech/details/4241/)
- [Seleniumとは？WebDriverの仕組みと4系の実行手順・ツール選定を解説](/tech/details/17435/)
- [DrissionPageとは？ドライバ不要でSeleniumより高速なPythonスクレイピングライブラリ](/tech/details/9916/)
- [Firecrawlとは｜料金・使い方・セルフホストを競合比較とAPI例で解説【2026】](/tech/details/11350/)

---

出典: [BeautifulSoupとは？pip installと使い方（find・select）を解説【bs4 4.15】](<https://www.issoh.co.jp/tech/details/3018/>)（株式会社一創）
