先にアドバイスをしておくと、一連の処理を長く書いているとエラーが見つけにくいので、適度に切り出して関数にするとよいでしょう。また、try
文の中が長いとどのような処理に対してエラーをキャッチしたいのかわかりにくいため、できるだけ処理を分離したほうが良いです。
さて、回答ですが今回はスクレイピングしたデータを仕分けする箇所を切り出してみました。
# coding: utf-8
import re
# スクレイピングしたデータを仕分けする(辞書型に変換する)
def sorting(data, categories):
# 結果用
result = {category: {"quantity": 0, "amount": 0} for category in categories}
# カテゴリーごとに点数と金額を集計
for category in categories:
quantity, amount = 0, 0
for item in data:
if category in item:
item = item.replace(category, "") # 'Anti146点¥110,847' --> '146点¥110,847'
money = re.search('¥(.*)', item).group() # '146点¥110,847' --> '¥110,847'
quantity += int(item.replace("点"+money, "")) # '146点¥110,847' --> '146'
amount += int(re.sub("¥|,", "", money)) # '¥110,847' --> '110847'
result[category]["quantity"] = quantity
result[category]["amount"] = amount
return result
今後の拡張性も考えて、カテゴリーごとに点数と金額を仕分けして辞書型に格納しました。集計はfor
文で金額を取得して合計すればよいです。
以下のようにテストしてみたら、金額の合計が質問者さんの希望と少しずれてしまいましたが、希望の金額は手計算によるミスですかね。私が間違っていたらすみません。
# カテゴリーの集合
categories = set([
"Anti","Primi","Secondi","Dolci","ランチ",
"テイクアウト","コース","未設定"
])
# スクレイピングしたデータ(テスト用)
data = [
'Anti146点¥110,847',
'Primi140点¥123,435',
'Secondi39点¥19,340',
'Dolci45点¥10,950',
'Vino107点¥27,400',
'ノンアルコール201点¥15,120',
'Birra78点¥15,420',
'カクテル92点¥19,600',
'ランチ264点¥155,540',
'テイクアウト7点¥1,980',
'未設定8点¥9,800',
'ランチ1点¥1,270'
]
# 仕分け
result = sorting(data, categories)
# 集計
total = 0
for data in result.values():
total += data["amount"]
print(f"フード合計:{total}")
# フード合計:433162
スクレイピングとあわせるならこんな感じ。
# カテゴリーの集合
categories = set([
"Anti","Primi","Secondi","Dolci","ランチ",
"テイクアウト","コース","未設定"
])
data = []
try :
for product in soup.select('.inner-content.inactive'):
products = product.getText()
data.append(products)
except NoSuchElementException:
pass
# 仕分け
result = sorting(data, categories)
# 集計
total = 0
for data in result.values():
total += data["amount"]
print(f"フード合計:{total}")
Like!