#!/usr/bin/env python3 """Final Top-30 SO Deals HTML with verified images.""" import re from datetime import datetime NOW = datetime.now().strftime("%d.%m.%Y %H:%M") OUT = "/home/hermes/workspace/spiele_offensive_top30.html" # Verified images from product pages (fetched individually) img_map = { "1026921": "1026921_3.jpg", "1028349": "Article_000001028349_2025-07-18_13_05_12_921000.jpg", "1030474": "1030474.jpg", "1033566": "Box_894d0185-a2aa-4f24-a3c8-10070ccc6304_2048x2048.webp", "1028724": "1028724.jpg", "1030971": "main.jpg", "1026525": "1026525.jpg", "1029919": "1029919.jpg", "1031362": "Article_000001031362_2024-03-28_07_29_07_259500.jpg", "1034548": "20260505_103317.png", "1024744": "1024744.jpg", "1028441": "1028441.jpg", "1027906": "1027906.jpg", "1027919": "1027919.jpg", "1027138": "1027138.jpg", "1034592": "1031998_main.webp", "1029966": "MAIN.png", "1027053": "1027053.jpg", "1025619": "1025619.jpg", "1029965": "1029965.jpg", "1030312": "1030312.jpg", "1028661": "Article_000001028661_2025-06-12_13_34_35_190800.png", "1013706": "1013706.jpg", "1032108": "Article_000001032108_2026-04-08_14_04_52_467900.png", "1031736": "1031736.png", "1034433": "1034433.jpg", "1030392": "1030392.jpg", "1030811": "1030811.jpg", "1003800": "1003800.jpg", "1034354": "schnipptrickcover_hoch_rgb.jpg", "1024430": "1024430.jpg", "1026552": "cnoxu9yw.jpg", "1029637": "1029637.jpg", "1027584": "1027584.jpg", "1031069": "1031069_main.jpg", "1032911": "1032911.webp", "1034007": "4002051687427.jpg", "1014267": "1014267.jpg", } def img_url(aid): fn = img_map.get(aid) if not fn: return None return "https://mediaservice.happyshops.com/ANY/Article/{}/width=200/{}".format( int(aid).__format__("012d"), fn) with open("/home/hermes/workspace/spiele_offensive_deals.html") as f: dhtml = f.read() deals = [] for m in re.finditer( r'
([^<]+)
.*?' r'
]*>([^<]+)
.*?' r'([^<]*).*?' r'([^<]+).*?' r'= 80 else ("#e63946" if rabatt >= 60 else "#cc0c39") src = img_url(aid) if src: img_tag = ''.format(src) else: img_tag = '
?
' cards.append("""
{}
{} {} EURUVP {} EUR -{}% {} Zu Spiele-Offensive →
""".format(img_tag, name, new, old, bc, rabatt, saved, aid)) html = """ Top 30 Brettspiel-Angebote — Spiele-Offensive.de

Top 30 Brettspiel-Angebote auf Spiele-Offensive.de

Stand: """ + NOW + """ · Sortiert nach Rabatt · Preise inkl. MwSt. · Affiliate-Links (PID 505) · Bilder: Spiele-Offensive

""" + "\n".join(cards) + """
""" with open(OUT, "w") as f: f.write(html) img_count = html.count('