diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 2d12b324..4a9aeba4 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -112,37 +112,42 @@ class DealfrontScraper: def extract_current_page_results(self): """ - Extrahiert Firmennamen und Webseiten zeilenbasiert für maximale Zuverlässigkeit. + Extrahiert Daten NUR aus den sichtbaren Ergebniszeilen und optimiert die Wartezeiten. """ try: - logger.info("Extrahiere Ergebnisse von der aktuellen Seite (zeilenbasierter Ansatz)...") + logger.info("Extrahiere Ergebnisse von der aktuellen Seite (optimierter Ansatz)...") results = [] - rows_selector = (By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") - # Wir warten nur kurz, da die `login_and_find_list` das Laden schon bestätigt hat. - time.sleep(2) - rows = self.driver.find_elements(*rows_selector) - logger.info(f"{len(rows)} Firmen-Zeilen gefunden.") + # 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)) + + # 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...") - for i, row in enumerate(rows, 1): + for i, row in enumerate(all_rows, 1): try: - # Innerhalb jeder Zeile (row) suchen wir jetzt die spezifischen Elemente. - company_name_element = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text") + # 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() - - # Die Website ist in der dritten Zelle (td). Wenn es keinen Link gibt, ist die Zelle trotzdem da. - website_cell = row.find_element(By.CSS_SELECTOR, "td:nth-of-type(3)") - website = website_cell.text.strip() # .text gibt immer den sichtbaren Text zurück, auch wenn kein -Tag da ist. - results.append({'name': company_name, 'website': website or "N/A"}) # Fallback für leere Websites + website_element = row.find_element(By.CSS_SELECTOR, "td:nth-of-type(3) a") + website = website_element.text.strip() + + if company_name: + results.append({'name': company_name, 'website': website or "N/A"}) + except NoSuchElementException: - logger.warning(f"Zeile {i}: Wichtige Elemente nicht gefunden. Überspringe.") + # Das ist jetzt erwartet für "Geister"-Zeilen. Wir loggen das nicht mehr als Warning. continue - logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen verarbeitet.") + logger.info(f"Extraktion abgeschlossen. {len(results)} gültige Firmen gefunden.") return results + except Exception as e: - logger.error(f"Fehler bei der Extraktion: {type(e).__name__}", exc_info=True) + logger.error(f"Schwerwiegender Fehler bei der Extraktion: {type(e).__name__}", exc_info=True) self._save_debug_artifacts() return []