アイキャッチ画像

PythonのBeautifulSoup4でHTMLの要素を検索する

PythonのBeautifulSoup4モジュールを使って、HTMLファイルの中から指定したタグの要素を見つけてみます。

目次

  1. find_allメソッド
  2. findメソッド

find_allメソッド

find_allメソッドは、指定した条件に合致する要素を全て見つけて、リストの形式で返します。

ret = soup.find_all([name], [attrs], [recursive], [string], [limit])
変数 内容
ret 条件に合致する要素のリスト。
soup 検索対象のHTMLドキュメントのBeautifulSoupオブジェクト。
name 省略可。タグ名。
attrs 省略可。要素名。
recursive 省略可。
string 省略可。要素の内容。
limit 省略可。

例えばこんなHTMLファイルがあったとします。名前はindex.htmlです。

<html>
    <head></head>
    <body>
        <h1 class="1st">最初の章</h1>
            <ul>
                <li id="foo">項目1</li>
                <li id="bar">項目2</li>
                <li id="bar">項目3</li>
            </ul>
        <h1 class="2nd">2つめの章</h1>
            <p>文章</p>
    </body>
</html>

Pythonを起動して、検索してみます。

>>> from bs4 import BeautifulSoup
>>> with open('index.html', mode='rt', encoding='utf-8') as fi:
...     soup = BeautifulSoup(fi.read(), 'html.parser')
...

>>> soup.find_all('h1')
[<h1 class="1st">最初の章</h1>, <h1 class="2nd">2つめの章</h1>]

>>> soup.find_all('ul')
[<ul>
<li id="foo">項目1</li>
<li id="bar">項目2</li>
<li id="bar">項目3</li>
</ul>]

>>> soup.find_all('li')
[<li id="foo">項目1</li>, <li id="bar">項目2</li>, <li id="bar">項目3</li>]

ヒットした要素の子要素は取り出されず、ヒットした要素そのものが抽出されます。

属性で検索してみます。

>>> soup.find_all(attrs={'id':'bar'})
[<li id="bar">項目2</li>, <li id="bar">項目3</li>]

>>> soup.find_all(id='bar')
[<li id="bar">項目2</li>, <li id="bar">項目3</li>]

>>> soup.find_all(class_='2nd')
[<h1 class="2nd">2つめの章</h1>]

attrs引数に辞書を設定すると、複数の属性と値のペアを抽出できます。 属性=値の形で指定する方が簡単ですね。

内容で検索してみます。

>>> soup.find_all(string='章')
[]

>>> soup.find_all(string='文章')
['文章']

一致しないとだめなようです。

正規表現を使ってみます。

>>> import re
>>> soup.find_all(string=re.compile('章'))
['最初の章', '2つめの章', '文章']

findメソッド

書式はfind_allと同じです。

戻り値が、find_allはリストですが、findは単一の値が返ります。見つからない場合の戻り値が、find_allは空のリストですが、findの場合はNoneが返ってきます。

bodu要素とかHTMLドキュメントには1つしか存在できないはずなので、そういう場合はfind_allよりも便利でしょう。

広告

PythonとXMLカテゴリの投稿