本文へスキップ
BecomeCoder

Pythonスクレイピングコース · 第2章 BeautifulSoupで解析する · レッスン5

複数まとめて取る ― find_all

ブラウザで完結

導入

一覧ページから「すべての項目」を集めたいことがほとんどです。find が最初の1つだけなのに対し、find_all当てはまるものを全部リストで返します。

説明

from bs4 import BeautifulSoup

html = """
<ul>
  <li>りんご</li>
  <li>みかん</li>
  <li>ぶどう</li>
</ul>
"""

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

items = soup.find_all("li")   # <li> を全部、リストで取得
print("件数:", len(items))    # 件数: 3

for li in items:
    print(li.text)
  • soup.find_all("li") … すべての <li>リストで返します。1件も無ければ空リスト []
  • len(items) で件数が分かります。
  • for li in items: で1つずつ取り出し、li.text で中身を得ます。

実行結果:

件数: 3
りんご
みかん
ぶどう

find は「最初の1つ」、find_all は「全部」。一覧を集めるときは find_allループ、が基本の型です。

やってみよう

html<li> を1つ増やすと、件数: も自動的に増えます。何件あっても同じコードで処理できるのが、find_all とループを組み合わせる利点です。

演習

上の <li> の中で、2番目の要素(みかん)だけを print してください。

ヒント1を見る

find_all の戻り値はリストなので、items[1] が2番目(添字は0始まり)。print(items[1].text)

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、本物の BeautifulSoup(Pyodide)でHTMLの解析をその場で試せます。初回だけ読み込みに少し時間がかかります。本文のHTMLを書き換えたり、抜き出すタグを変えたりして、結果の変化を確かめましょう(ネットからの取得は第5章の読み物で解説します)。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。