【Python応用】BeautifulSoupのスクレイピングで役立つCSSセレクタの基本と書き方まとめ

Python

PythonでWebスクレイピングを行うとき、BeautifulSoupライブラリはとても便利です。
その中で要素を効率的に取得するためのテクニックが「CSSセレクタ」です。

この記事では、「BeautifulSoup × CSSセレクタ」を前提に、初心者でも理解しやすいように基本の書き方から使用例までを丁寧に解説していきます。

スポンサーリンク
スポンサーリンク

CSSセレクタとは?

CSSセレクタは、HTML要素を指定するための記法で、もともとはWebページのスタイル(見た目)を指定するために使われてきました。しかし、スクレイピングでも「特定の要素を探す」ために同じ文法が使えます。

例えば:

soup.select('div.article')

この1行だけで、HTML中のすべての <div class="article"> を取得できます。

基本のセレクタ一覧(要素・クラス・ID)

記法意味使用例
*すべての要素soup.select('*')
div指定した要素名soup.select('div')
.classNameクラス属性を持つ要素soup.select('.news')
#idNameID属性を持つ要素soup.select('#main-title')

セレクタの組み合わせ(階層・隣接)

記法意味使用例
A, BAまたはBすべてsoup.select('h1, h2')
A BAの中のすべてのB(子孫)soup.select('div p')
A > BAの直下のB(子)soup.select('ul > li')
A + BAに隣接するB(直後)soup.select('h2 + p')
A ~ BA以降の兄弟要素のBsoup.select('h2 ~ p')

属性セレクタ

HTMLタグの属性に基づいて要素を選択する方法です。

記法意味使用例
[attr]特定の属性を持つ要素a[href](リンク要素)
[attr="value"]属性値が完全一致input[type="text"]
[attr^="val"]属性値が「val」で始まるimg[src^="https"]
[attr$="val"]属性値が「val」で終わるa[href$=".pdf"]
[attr*="val"]属性値に「val」を含むdiv[class*="main"]

要素の位置や状態に関するセレクタ

これらは、リストやUI部品の特定の位置・状態を判定するのに便利です。

セレクタ意味使用例
:first-child最初の子要素ul li:first-child
:last-child最後の子要素ul li:last-child
:nth-child(n)n番目の子要素ul li:nth-child(2)
:only-child一つだけの子要素div:only-child
:empty中身が空の要素p:empty
:not(selector)除外div:not(.active)

使用例(BeautifulSoupと組み合わせ)

from bs4 import BeautifulSoup
import requests

url = 'https://example.com/news'
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')

# クラス名が "headline" のh2タグを取得
titles = soup.select('h2.headline')
for title in titles:
    print(title.text)

# aタグのhref属性がhttpsで始まるリンクを取得
secure_links = soup.select('a[href^="https"]')

よくあるミス・注意点

IDやクラス名の指定ミス

  • クラス名は「.(ドット)」をつける
  • IDは「#(シャープ)」をつける
  • HTML上でのスペルや大文字小文字に注意

属性セレクタに「””」を忘れない

# 正しい
soup.select('input[type="checkbox"]')

# 間違い(SyntaxErrorになります)
soup.select('input[type=checkbox]')

select_one()とselect()の違い

  • select()リスト を返す
  • select_one()最初の要素だけ返す

まとめ:覚えておきたいCSSセレクタ5選

セレクタよく使う場面
.classクラス指定の要素全体を取得
#id固定IDを持つ要素の取得
div > pネスト構造から特定の要素を取得
a[href$=".pdf"]PDFリンクの抽出
li:nth-child(3)リスト中の特定の行を取得

補足:セレクタの調査にはブラウザの開発者ツール

ChromeやEdgeなどの開発者ツール(F12)を開いて、該当のHTML要素を右クリック → Copy selector を使えば、正確なセレクタをコピーできます。スクレイピング対象の特定には非常に便利です!

関連記事リンク

タイトルとURLをコピーしました