This commit is contained in:
2025-07-08 10:05:42 +00:00
parent c2cffdc27d
commit 257cfd078c

View File

@@ -235,45 +235,56 @@ class DealfrontScraper:
self._save_debug_artifacts()
return False
def extract_current_page_results(self):
def extract_current_page_results(self):
"""
Extrahiert die Firmennamen und Webseiten. Wenn keine Zeilen gefunden werden,
wird der komplette Seitenquelltext für die Analyse gespeichert.
Extrahiert Firmennamen und Webseiten direkt von der Seite
mithilfe der verifizierten, präzisen CSS-Selektoren.
"""
try:
logger.info("Extrahiere Ergebnisse von der aktuellen Seite...")
results = []
# Warten, bis ein stabiles Element der Seite geladen ist, z.B. die Tabellenüberschrift.
header_selector = (By.XPATH, "//th[normalize-space()='Firma']")
self.wait.until(EC.visibility_of_element_located(header_selector))
logger.info("Tabellen-Header gefunden. Warte kurz, damit die Datenzeilen rendern können...")
time.sleep(5) # Großzügige Wartezeit für das Rendern der Daten
# Warten, bis das erste Element, das wir suchen (ein Firmenname), vorhanden ist.
# Das ist ein stabiler Indikator, dass die Liste geladen ist.
company_name_selector = ".sticky-column a.t-highlight-text"
logger.info(f"Warte auf das erste Firmenelement mit Selektor: '{company_name_selector}'")
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, company_name_selector)))
# Kurze, feste Pause, damit alle Elemente vollständig gerendert werden können.
time.sleep(3)
# Wir versuchen es erneut mit dem präzisesten Selektor für die Zeilen.
rows_selector = (By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")
rows = self.driver.find_elements(*rows_selector)
# === DIREKTE EXTRAKTION ALLER ELEMENTE MIT IHREN SELEKTOREN ===
company_elements = self.driver.find_elements(By.CSS_SELECTOR, company_name_selector)
website_elements = self.driver.find_elements(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text")
if not rows:
logger.warning("Keine Ergebniszeilen (tr[id]) gefunden. Speichere den kompletten Seiten-Quelltext für die Analyse.")
# RUFE DIE DEBUG-FUNKTION AUF, UM DEN FEHLER ZU FINDEN
logger.info(f"{len(company_elements)} Firmennamen und {len(website_elements)} Webseiten-Elemente gefunden.")
if not company_elements:
logger.warning("Keine Firmen mit dem angegebenen Selektor gefunden. Speichere Debug-Artefakte.")
self._save_debug_artifacts()
logger.warning("HTML-Dump wurde erstellt. Breche die Extraktion ab.")
return []
logger.info(f"{len(rows)} Firmen-Datenzeilen zur Verarbeitung gefunden.")
# (Der Rest der Extraktionslogik bleibt wie zuvor)
for i, row in enumerate(rows, 1):
# Wir iterieren über die gefundenen Firmen-Elemente
for i, company_element in enumerate(company_elements):
try:
company_name = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text").get_attribute("title").strip()
website = row.find_element(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text").text.strip()
results.append({'name': company_name, 'website': website})
# Firmenname aus dem 'title'-Attribut extrahieren (verhindert abgeschnittenen Text)
company_name = company_element.get_attribute("title").strip()
# Zugehörige Webseite finden, indem wir von der Zeile (tr) des Firmen-Elements ausgehen
row = company_element.find_element(By.XPATH, "./ancestor::tr")
website_element = row.find_element(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text")
website = website_element.text.strip()
if company_name and website:
results.append({'name': company_name, 'website': website})
else:
logger.warning(f"Zeile {i+1}: Unvollständige Daten (Name: '{company_name}', Webseite: '{website}').")
except NoSuchElementException:
logger.warning(f"Zeile {i}: Konnte Name oder Webseite nicht extrahieren. Überspringe.")
logger.warning(f"Zeile {i+1}: Konnte Webseite für Firma '{company_name}' nicht finden. Überspringe.")
continue
logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen gefunden.")
logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen erfolgreich zugeordnet.")
return results
except Exception as e: