diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py
index 4a9aeba4..573c4b2b 100644
--- a/dealfront_enrichment.py
+++ b/dealfront_enrichment.py
@@ -115,35 +115,43 @@ class DealfrontScraper:
Extrahiert Daten NUR aus den sichtbaren Ergebniszeilen und optimiert die Wartezeiten.
"""
try:
- logger.info("Extrahiere Ergebnisse von der aktuellen Seite (optimierter Ansatz)...")
+ logger.info("Extrahiere Ergebnisse mit dem finalen, präzisen Selektor...")
results = []
- # Warten, bis die erste Daten-Zelle (Firmenname) sichtbar ist. Das ist unser Anker.
- first_company_cell_selector = (By.CSS_SELECTOR, "td.sticky-after-checkbox a.t-highlight-text")
- self.wait.until(EC.visibility_of_element_located(first_company_cell_selector))
+ # 1. Warten, bis die erste Daten-Zeile (bzw. deren Firmen-Link) sichtbar ist.
+ # Das ist unser Anker, dass die Daten geladen sind.
+ first_company_link_selector = (By.CSS_SELECTOR, "td.sticky-after-checkbox a.t-highlight-text")
+ self.wait.until(EC.visibility_of_element_located(first_company_link_selector))
- # Finde alle Tabellenzeilen.
- all_rows = self.driver.find_elements(By.CSS_SELECTOR, "table#t-result-table tbody tr")
- logger.info(f"Insgesamt {len(all_rows)}
-Elemente im tbody gefunden. Filtere nach sichtbaren Datenzeilen...")
+ # 2. Finde NUR die Zeilen, die tatsächlich einen Firmennamen-Link enthalten.
+ # Dieser XPath ist extrem robust.
+ rows_with_data_selector = (By.XPATH, "//table[@id='t-result-table']/tbody/tr[.//a[contains(@class, 't-highlight-text')]]")
+ rows = self.driver.find_elements(*rows_with_data_selector)
+ logger.info(f"{len(rows)} gültige Firmen-Datenzeilen gefunden.")
- for i, row in enumerate(all_rows, 1):
+ if not rows:
+ logger.warning("Konnte keine gültigen Datenzeilen extrahieren.")
+ self._save_debug_artifacts()
+ return []
+
+ for row in rows:
try:
- # Wir prüfen pro Zeile, ob sie die benötigten Elemente enthält.
- # Das ist viel robuster als alle Elemente auf einmal zu suchen.
- company_name_element = row.find_element(By.CSS_SELECTOR, "td.sticky-after-checkbox a.t-highlight-text")
- company_name = company_name_element.get_attribute("title").strip()
-
- website_element = row.find_element(By.CSS_SELECTOR, "td:nth-of-type(3) a")
- website = website_element.text.strip()
+ # Innerhalb dieser garantiert validen Zeilen können wir nun sicher extrahieren.
+ company_name = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text").get_attribute("title").strip()
- if company_name:
- results.append({'name': company_name, 'website': website or "N/A"})
-
- except NoSuchElementException:
- # Das ist jetzt erwartet für "Geister"-Zeilen. Wir loggen das nicht mehr als Warning.
+ # Versuche, die Webseite zu finden. Wenn nicht vorhanden, wird sie "N/A".
+ try:
+ website = row.find_element(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text").text.strip()
+ except NoSuchElementException:
+ website = "N/A"
+
+ results.append({'name': company_name, 'website': website})
+ except NoSuchElementException as e:
+ # Dieser Fall sollte jetzt kaum noch auftreten.
+ logger.warning(f"Konnte Daten aus einer Zeile nicht extrahieren, obwohl sie valide schien: {e}")
continue
- logger.info(f"Extraktion abgeschlossen. {len(results)} gültige Firmen gefunden.")
+ logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen verarbeitet.")
return results
except Exception as e: