BeautifulSoupで複数条件(class・id)で抽出する

BeautifulSoupを利用して、複数のclassやidを条件に抽出する方法を解説します。

「classとid」につきましては、表記の違いのみのため、この記事ではclassのみについて記述します。

soup.find_all(id="xxx") # find_allでidで抽出する場合
soup.find_all(class_="xxx) # find_allでclassで抽出する場合
soup.select("#id") # selectでidで抽出する場合
soup.select(".class") # selectでclassで抽出する場合

同様にfind_all()find()select()select_one()につきましても、取得する要素の数が異なるだけのため、find_all()およびselect()に絞って解説します。

複数条件を指定したい場合は、select()の方が汎用性が高いです。またこの記事では関数を利用した方法は、解説しません。

目次

find_all()

find_all()を使って、複数の条件を指定したい場合は、次のように記述します。

soup.find_all(class_='className1 className2')

しかしこの記述の場合は、class="classNama1 className3 className2"となっている場合は、対象となりません。

柔軟に複数条件で抽出したい場合は、select()を利用することをお勧めします。

select()

select()を使って、複数の条件を指定したい場合は、次のように記述します。

soup.select(class_='.className1.className2')

この記述は、find_all()と違って、class="classNama1 className3 className2"となっている場合でも対象となります。

また次のように特定のクラスを含み、特定のクラスを含まないタグを探すこともできます。

soup.select('.className1:not(.className2)')

さらに次にように特定のタグではない特定のクラスを含むタグを探すことも可能です。

soup.select('.className1:not(title)')

select()はCSSの知識さえあれば、かなり柔軟な抽出が可能となります。困ったときはselect()を利用を検討してみてください。

目次