導入
抽出したデータは、**「1件=辞書」「全体=辞書のリスト」**の形にまとめると、後の集計や保存がぐっと楽になります。スクレイピングの定番のゴール地点です。
説明
from bs4 import BeautifulSoup
html = """
<div class="item"><span class="name">りんご</span><span class="price">120</span></div>
<div class="item"><span class="name">みかん</span><span class="price">80</span></div>
<div class="item"><span class="name">ぶどう</span><span class="price">300</span></div>
"""
soup = BeautifulSoup(html, "html.parser")
products = []
for card in soup.select(".item"):
products.append({
"name": card.find(class_="name").text,
"price": int(card.find(class_="price").text), # 数値に変換
})
print(products)
print("最高値:", max(p["price"] for p in products))
- 1件ぶんを
{"name": ..., "price": ...}の辞書にして、リストproductsにappendします。 int(...)で価格を数値に変換しておくと、あとで合計や最大値を計算できます(HTMLから取れる値は必ず文字列なので、数値にする一手間が要ります)。max(p["price"] for p in products)のように、集めたデータをそのまま集計に使えます。
このように「辞書のリスト」にしておくと、pandas に渡して分析したり、次のレッスンで CSV に保存したりと、応用が一気に広がります。
やってみよう
int(...) を外して価格を文字列のままにすると、max(...) が文字列の比較になり、期待とちがう結果になることがあります。「数として扱いたい値は int / float に変換」を習慣にしましょう。
演習
products の中の価格の合計を sum(...) で計算して print してください。
ヒント1を見る
print(sum(p["price"] for p in products))。int 変換済みなので合計できます。