From 257cfd078c77ef1dfd61e6a16e58787883bb8bc4 Mon Sep 17 00:00:00 2001 From: Floke Date: Tue, 8 Jul 2025 10:05:42 +0000 Subject: [PATCH] bugfix --- dealfront_enrichment.py | 59 ++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 7bb5e0a0..1c7bcbf8 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -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: