導入
一覧ページから「すべての項目」を集めたいことがほとんどです。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)。