閉じる

PythonのBeautifulSoupでclassを指定して要素を取得する方法|複数指定や部分一致の手法まで解説

Pythonを使用したWebスクレイピングにおいて、特定のデータを抽出するために最も頻繁に利用されるのが「HTMLクラス(class)」を条件にした要素の取得です。

Webサイトの構造は多様化しており、単一のクラス指定だけでなく、複数のクラスが組み合わさっていたり、動的にクラス名が変化したりするケースも少なくありません。

BeautifulSoupを活用すれば、単純なクラス指定から、CSSセレクタを用いた高度な抽出、さらには正規表現を組み合わせた部分一致検索まで、柔軟に対応することが可能です。

本記事では、2026年現在のモダンなWebサイト構造にも対応できるよう、BeautifulSoupでclassを指定して要素を取得するためのあらゆる手法を詳しく解説します。

BeautifulSoupでclassを指定する基本:findとfind_all

BeautifulSoupで要素を探す際、最も直感的なメソッドがfind()find_all()です。

しかし、Pythonにおいてclassは予約語(クラス定義に使用される単語)であるため、引数としてそのまま使用することはできません。

class_引数を使用した指定方法

BeautifulSoupでは、予約語との衝突を避けるためにアンダースコアを付けた「class_」という引数名を使用します。

Python
from bs4 import BeautifulSoup

# サンプルHTML
html_content = """
<div class="content">
    <p class="text">こんにちは、スクレイピングの世界へ!</p>
    <p class="text">BeautifulSoupをマスターしましょう。</p>
    <span class="note">注釈テキストです。</span>
</div>
"""

soup = BeautifulSoup(html_content, 'html.parser')

# 単一の要素を取得 (最初に一致したもの)
first_text = soup.find(class_="text")
print(f"findの結果: {first_text.text}")

# すべての要素をリスト形式で取得
all_texts = soup.find_all(class_="text")
for i, element in enumerate(all_texts):
    print(f"find_allの結果[{i}]: {element.text}")
実行結果
findの結果: こんにちは、スクレイピングの世界へ!
find_allの結果[0]: こんにちは、スクレイピングの世界へ!
find_allの結果[1]: BeautifulSoupをマスターしましょう。

このように、class_を用いることで、特定のクラス名を持つタグを簡単にフィルタリングできます。

もしタグの種類(pタグやdivタグなど)も限定したい場合は、第一引数にタグ名を指定します。

attrs引数を使用した指定方法

別の方法として、attrs引数に辞書形式でクラスを指定する方法もあります。

この方法では、「class」を文字列のキーとして扱うため、アンダースコアは不要です。

Python
# attrs引数を使用する方法
element = soup.find(attrs={"class": "note"})
print(element.text)
実行結果
注釈テキストです。

複数の属性(idやdata属性など)と組み合わせて検索したい場合は、このattrsを利用するとコードの見通しが良くなります。

複数のclassを指定して要素を取得する方法

現代のWebフロントエンド開発、特にTailwind CSSなどのユーティリティファーストなフレームワークが普及している環境では、1つの要素に複数のクラスが設定されていることが一般的です。

複数のクラスをすべて含む要素(AND条件)

特定の要素が「class-a」と「class-b」の両方を持っている場合にのみ取得したいときは、リストを使って指定します。

Python
html_multi = """
<div class="btn primary large">送信ボタン</div>
<div class="btn primary">保存ボタン</div>
<div class="btn">キャンセル</div>
"""
soup = BeautifulSoup(html_multi, 'html.parser')

# 'btn' と 'primary' と 'large' のすべてを持つ要素
target = soup.find(class_=["btn", "primary", "large"])
print(f"取得したボタン: {target.text}")
実行結果
取得したボタン: 送信ボタン

ただし、find_all(class_=["a", "b"])という記述は、ライブラリのバージョンや書き方によっては「aまたはbのいずれかを持つ」というOR条件として解釈される場合があります。

厳密に「すべてのクラスを含む」状態を指定したい場合は、後述するCSSセレクタ(select)の使用を強く推奨します。

いずれかのクラスを含む要素(OR条件)

「class-a」または「class-b」のどちらか一方でも持っていれば取得したい、という場合はfind_allにリストを渡します。

Python
# 'primary' または 'note' クラスを持つ要素をすべて取得
elements = soup.find_all(class_=["primary", "note"])

この手法は、サイト内の異なるデザインパーツを一括で取得したい際に非常に便利です。

部分一致や正規表現による柔軟なclass指定

Webサイトの中には、クラス名の一部に動的な数値が含まれていたり、特定のプレフィックス(接頭辞)が付与されていたりするものがあります。

これらを正確に捉えるには、正規表現(reモジュール)を活用します。

正規表現を用いたパターンマッチング

例えば、item-123item-456のように、item-から始まるクラス名を持つ要素をすべて取得したい場合のコードは以下の通りです。

Python
import re

html_regex = """
<ul>
    <li class="product-item-001">商品A</li>
    <li class="product-item-002">商品B</li>
    <li class="blog-post">記事タイトル</li>
</ul>
"""
soup = BeautifulSoup(html_regex, 'html.parser')

# クラス名に 'product-item' を含む要素を取得
products = soup.find_all(class_=re.compile(r"product-item-"))

for product in products:
    print(f"マッチした商品: {product.text}")
実行結果
マッチした商品: 商品A
マッチした商品: 商品B

正規表現を利用することで、特定の文字列で始まる、終わる、あるいは特定のキーワードを含むといった高度な条件指定が可能になります。

これはスクレイピングにおいて非常に強力な武器となります。

指定方法コード例用途
前方一致re.compile(r"^prefix-")特定の文字列で始まるクラス
後方一致re.compile(r"-suffix$")特定の文字列で終わるクラス
部分一致re.compile(r"keyword")文字列が含まれているクラス

CSSセレクタ(select/select_one)による高度な取得

BeautifulSoupにおいて、実務で最も多用されるのがselect()およびselect_one()メソッドです。

これらはCSSセレクタの記法をそのまま利用できるため、Webエンジニアにとって馴染み深く、かつ直感的に複雑な構造を指定できます。

基本的な使い方

CSSと同様に、クラス指定にはドット(.)を使用します。

Python
# CSSセレクタでの取得
container = soup.select_one(".content")
items = soup.select(".content .text") # 子孫要素の指定も簡単

複数クラスのAND条件・OR条件

CSSセレクタを使えば、クラスのAND/OR条件も明確に記述できます。

  • AND条件: .class1.class2(ドットを繋げて記述)
  • OR条件: .class1, .class2(カンマで区切って記述)
Python
html_css = """
<div class="box red rounded">赤い角丸ボックス</div>
<div class="box blue">青いボックス</div>
<div class="sidebar">サイドバー</div>
"""
soup = BeautifulSoup(html_css, 'html.parser')

# red かつ rounded クラスを持つ要素 (AND)
and_element = soup.select_one(".red.rounded")
print(f"AND条件: {and_element.text}")

# red または sidebar クラスを持つ要素 (OR)
or_elements = soup.select(".red, .sidebar")
for el in or_elements:
    print(f"OR条件: {el.text}")
実行結果
AND条件: 赤い角丸ボックス
OR条件: 赤い角丸ボックス
OR条件: サイドバー

属性セレクタによる部分一致

CSSセレクタの「属性セレクタ」記法を使えば、正規表現を使わずに部分一致を実現することも可能です。

  • [class^="val"]:前方一致(valで始まる)
  • [class$="val"]:後方一致(valで終わる)
  • [class\*="val"]:部分一致(valを含む)
Python
# クラス名に 'box' を含む要素をすべて取得
box_elements = soup.select('[class*="box"]')

CSSセレクタは読みやすくメンテナンス性が高いため、特別な理由がない限りはfind系よりもselect系を優先して使用することをおすすめします。

2026年のWebサイト事情と注意点

近年のWeb開発トレンドを踏まえると、単純なクラス指定だけでは対応できないケースが増えています。

以下の点に留意してコーディングを行いましょう。

1. Tailwind CSS等のマルチクラスへの対応

2026年現在、多くのモダンなWebサイトではclass="p-4 m-2 flex items-center justify-between"といった大量のユーティリティクラスが並んでいます。

このようなサイトでは、特定の1つのクラス(例:flex)だけに依存して要素を取得すると、意図しない要素まで大量にヒットしてしまいます。

対策として、「親要素のIDやクラス」と「目的の要素のクラス」を組み合わせて範囲を絞り込む階層的な指定(例:soup.select("#main-content .item-title"))を徹底してください。

2. 難読化されたクラス名への対処

ReactやNext.js、Vue.jsなどで構築されたサイトでは、ビルド時にクラス名が_1a2b3cのようにランダムな文字列へ変換(難読化)されることがあります。

この場合、クラス名で指定してもサイト更新のたびにコードが壊れてしまいます。

クラス名が不安定な場合は、以下の代替案を検討してください。

  • クラス名ではなく、タグの階層構造(nth-of-typeなど)を利用する
  • data-testidなどのカスタムデータ属性を探す
  • 要素内の特定のテキストをキーにして親要素を辿る

3. 動的なクラス追加

JavaScriptによって、クリックやスクロール後に初めて付与されるクラス(例:is-active)もあります。

BeautifulSoupは静的なHTMLを解析するライブラリであるため、ブラウザ実行後の状態を取得したい場合は、PlaywrightやSeleniumといったブラウザ自動操作ライブラリと組み合わせて使用する必要があります。

取得できない場合のトラブルシューティング

「正しいクラス名を指定しているはずなのに、結果が空(Noneや空リスト)になる」という問題は初心者が最も遭遇しやすい壁です。

以下のチェックリストを確認してください。

  1. スペルミスと「class_」の記述:
    class(アンダースコアなし)で引数を渡していないか再確認してください。
  2. 空白区切りの複数クラス:
    HTML上で class="aaa bbb" となっている場合、find(class_="aaa bbb") とそのまま記述すると、順番が入れ替わっていたり間に余分な空白があったりする場合に一致しません。
    この場合は、soup.select(".aaa.bbb") のように各クラスを個別に指定してください。
  3. User-Agentの設定:
    サーバー側がPythonによるアクセスを拒否しており、HTML自体が正しく取得できていない可能性があります。requestsライブラリなどを使用している場合は、ブラウザのUser-Agentをヘッダーに設定してください。
  4. HTMLの解析器(パーサー)の違い:
    html.parser 以外にも、lxmlhtml5lib を試すと、壊れたHTML構造でも正しく解析できることがあります。

まとめ

PythonのBeautifulSoupを用いてclass指定で要素を取得する方法には、基本的なfind_all(class_="...")から、柔軟性の高いCSSセレクタ、パターンマッチに強い正規表現まで多彩なアプローチがあります。

  • シンプルな単一クラス指定なら find / find_all
  • 複雑な階層や複数クラス、属性パターンでの指定なら select / select_one
  • 動的なクラス名には re.compile

これらを状況に合わせて使い分けることが、堅牢で効率的なスクレイピングコードを書くための近道です。

特に、CSSセレクタを活用した手法は現在のWeb開発において主流となっており、最も汎用性が高いため優先的に習得することをお勧めします。

取得したいWebサイトの構造をブラウザのデベロッパーツール(F12キー)でよく観察し、最も変化しにくく確実なセレクタを見極めることが、スクレイピング成功の鍵となります。

今回紹介したテクニックを駆使して、必要なデータを正確に抽出しましょう。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!