本文へスキップ
BecomeCoder

Pythonスクレイピングコース · 第4章 データを抽出して整形する · レッスン12

集めて構造化する ― 辞書のリスト

ブラウザで完結

導入

抽出したデータは、**「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": ...} の辞書にして、リスト productsappend します。
  • 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 変換済みなので合計できます。

実際に動かしてみよう

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

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

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