PythonのBeautifulSoup4でHTMLの要素を検索する
PythonのBeautifulSoup4モジュールを使って、HTMLファイルの中から指定したタグの要素を見つけてみます。
目次
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カテゴリの投稿
- PythonでHTMLから特定のタグを抜き出してCSVにする
- PythonでHTMLを加工する
- PythonでXMLと文字列の変換
- PythonでXMLの構造を表示してみた
- PythonでXMLの読み込みと書き出し
- PythonのBeautifulSoup4でHTMLに要素を追加する
- PythonのBeautifulSoup4でHTMLの要素の内容にアクセスする
- PythonのBeautifulSoup4でHTMLの要素の内容を削除する
- PythonのBeautifulSoup4でHTMLの要素の囲いを外す
- PythonのBeautifulSoup4でHTMLの要素を削除する
- PythonのBeautifulSoup4でHTMLの要素を抜き出す
- PythonのBeautifulSoup4でHTMLの要素を新しい要素で囲う
- PythonのBeautifulSoup4でHTMLの要素を検索する
- Pythonのxmlで要素を列挙する
- PythonのxmlモジュールのElementTreeのルート要素を取得する
- PythonのxmlモジュールのElementからElementTreeを作る