スクレイピングのおけるCSSセレクタ基本

サンプル

<div class="class" id="id">
    <h1>タイトル</h1>
    <h2>サブタイトル</h2>
    <p value="abc">テスト</p>
    <p value="abc def">テスト</p>
    <p value="abc-def">テスト</p>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</div>

基本

書式 説明 サンプル
* すべての要素 *
要素名 要素名の要素 div
.クラス名 id属性をつけた要素 div.class
#id名 id属性をつけた要素 div#id

セレクタ同士の関係

書式 説明 サンプル
セレクタ1,セレクタ2 複数のセレクタ h1,h2
セレクタ1 セレクタ2 セレクタ1の下の階層の子孫要素セレクタ2 div li
セレクタ1 > セレクタ2 セレクタ1の直下の階層の子要素セレクタ2 div > h1
セレクタ1 + セレクタ2 セレクタ1に隣接している要素セレクタ2※同じ階層 h1 + h2
セレクタ1 ~ セレクタ2 セレクタ1のあとにある要素セレクタ2※同じ階層 p ~ ul

セレクタの属性

書式 説明 サンプル
要素[value] 特定の属性を持つ要素 p[value]
要素[value="abc"] value属性にabcという値を持つ要素 p[value="abc"]
要素[value~="abc"] value属性にabcという単語が含まれる要素(スペース区切り) p[value~="abc"]
要素[value|="abc"] value属性にabcという単語が含まれる要素(ハイフン区切り) p[value|="abc"]
要素[value^="abc"] value属性にabcで始まる要素 p[value^="abc"]
要素[value$="abc"] value属性にdefで終わる要素 p[value$="def"]
要素[value*="e"] value属性にeという文字を含む要素 p[value*="e"]

プログラム

from bs4 import BeautifulSoup

html = '''\
<div class="class" id="id">
    <h1>タイトル</h1>
    <h2>サブタイトル</h2>
    <p value="abc">テスト</p>
    <p value="abc def">テスト</p>
    <p value="abc-def">テスト</p>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</div>
'''

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

# 基本
print(soup.select('*'))
print('-' * 30)
print(soup.select('div'))
print('-' * 30)
print(soup.select('div.class'))
print('-' * 30)
print(soup.select('div#id'))
print('-' * 30)

# セレクタ同士の関係
print(soup.select('h1,h2'))
print('-' * 30)
print(soup.select('div li'))
print('-' * 30)
print(soup.select('div > h1'))
print('-' * 30)
print(soup.select('h1 + h2'))
print('-' * 30)
print(soup.select('h1 ~ ul'))
print('-' * 30)

# セレクタの属性
# 属性あり
print(soup.select('p[value]'))
print('-' * 30)
# 単語一致は×、完全一致〇
print(soup.select('p[value="abc"]'))
print(soup.select('p[value="abc def"]'))
print(soup.select('p[value="abc-def"]'))
print('-' * 30)
# 単語一致(スペース区切り)
print(soup.select('p[value~="abc"]'))
print('-' * 30)
# 単語一致(ハイフン区切り)
print(soup.select('p[value|="abc"]'))
print('-' * 30)
# 前方一致
print(soup.select('p[value^="abc"]'))
print('-' * 30)
# 後方一致
print(soup.select('p[value$="def"]'))
print('-' * 30)
# 部分一致
print(soup.select('p[value*="e"]'))
print('-' * 30)