import asyncio import json from playwright.async_api import async_playwright async def test_scraper(): # Két probléma-fókuszú URL: a modern Aprilia és a régi, hibás HTML-ű BMW test_urls = [ "https://www.autoevolution.com/moto/aprilia-rs-660-factory-2025.html", "https://www.autoevolution.com/moto/bmw-f-650-gs-2011.html" ] async with async_playwright() as p: browser = await p.chromium.launch(headless=True) context = await browser.new_context( user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36" ) page = await context.new_page() for url in test_urls: print(f"\n{'='*60}") print(f"🌍 MEGNYITÁS: {url}") print(f"{'='*60}") # A DOM betöltése megvárása await page.goto(url, wait_until="domcontentloaded", timeout=60000) await asyncio.sleep(2) # Várunk picit a JS futásra # A TÖKÉLETESÍTETT AUTOEVOLUTION PARSZOLÓ script = """ () => { let results = {}; // 1. MÓDSZER: Régi motorok (pl. BMW F650GS) -> td.left és td.right let leftCells = document.querySelectorAll('td.left'); leftCells.forEach(cell => { let key = cell.innerText.replace(/:$/, '').trim(); let rightCell = cell.nextElementSibling; if(rightCell && rightCell.classList.contains('right')) { results[key] = rightCell.innerText.trim(); } }); // 2. MÓDSZER: Modern motorok (pl. Aprilia) -> dt és dd let dts = document.querySelectorAll('dt'); dts.forEach(dt => { let key = dt.innerText.replace(/:$/, '').trim(); let dd = dt.nextElementSibling; if(dd && dd.tagName.toLowerCase() === 'dd') { results[key] = dd.innerText.trim(); } }); // 3. MÓDSZER: Alternatív modern layout -> span.label és span.value let specRows = document.querySelectorAll('.spec-row'); specRows.forEach(row => { let label = row.querySelector('.label'); let value = row.querySelector('.value'); if(label && value) { let key = label.innerText.replace(/:$/, '').trim(); if (!results[key]) { results[key] = value.innerText.trim(); } } }); // 4. MÓDSZER: "Adler" típusú elavult leírások fallbackje -> Vastagított szöveg if (Object.keys(results).length === 0) { document.querySelectorAll('b, strong').forEach(b => { let key = b.innerText.replace(/:$/, '').trim(); if(key.length > 2 && key.length < 30) { let val = ""; // Ha a szöveg közvetlenül a tag után van (Text Node) if(b.nextSibling && b.nextSibling.nodeType === 3) { val = b.nextSibling.textContent.trim(); } // Ha egy másik elemben van else if (b.nextElementSibling && b.nextElementSibling.tagName !== 'B') { val = b.nextElementSibling.innerText.trim(); } if(val && !results[key]) { results[key] = val; } } }); } return results; } """ data = await page.evaluate(script) if data and len(data) > 0: # Kiszűrjük a zajt, csak a releváns műszaki adatokat hagyjuk meg relevant_keys = ["Type", "Displacement", "Bore X Stroke", "Compression Ratio", "Horsepower", "Torque", "Fuel System", "Gearbox", "Clutch", "Final Drive", "Frame", "Front Suspension", "Rear Suspension", "Front Brake", "Rear Brake", "Overall Length", "Overall Width", "Seat Height", "Wheelbase", "Fuel Capacity", "Weight", "Dry Weight", "Wet Weight", "Front", "Rear"] filtered_data = {k: v for k, v in data.items() if any(rk.lower() in k.lower() for rk in relevant_keys)} print("\n🟢 KINYERT ADATOK (DOM PARSZOLÓ):") print(json.dumps(filtered_data if filtered_data else data, indent=2, ensure_ascii=False)) print(f"\n✅ Összesen {len(filtered_data if filtered_data else data)} műszaki paramétert találtam.") else: print("\n🔴 NULLA ADAT - A DOM parszoló nem talált egyezést.") await browser.close() if __name__ == "__main__": asyncio.run(test_scraper())