diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 1c7bcbf8..53f83379 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -236,62 +236,62 @@ class DealfrontScraper: return False def extract_current_page_results(self): - """ - 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 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) + """ + 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 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) - # === 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") + # === 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") - logger.info(f"{len(company_elements)} Firmennamen und {len(website_elements)} Webseiten-Elemente gefunden.") + 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.") + if not company_elements: + logger.warning("Keine Firmen mit dem angegebenen Selektor gefunden. Speichere Debug-Artefakte.") + self._save_debug_artifacts() + return [] + + # Wir iterieren über die gefundenen Firmen-Elemente + for i, company_element in enumerate(company_elements): + try: + # 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+1}: Konnte Webseite für Firma '{company_name}' nicht finden. Überspringe.") + continue + + logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen erfolgreich zugeordnet.") + return results + + except Exception as e: + logger.error(f"Ein schwerwiegender Fehler ist bei der Extraktion der Ergebnisse aufgetreten: {type(e).__name__}", exc_info=True) self._save_debug_artifacts() return [] - # Wir iterieren über die gefundenen Firmen-Elemente - for i, company_element in enumerate(company_elements): - try: - # 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+1}: Konnte Webseite für Firma '{company_name}' nicht finden. Überspringe.") - continue - - logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen erfolgreich zugeordnet.") - return results - - except Exception as e: - logger.error(f"Ein schwerwiegender Fehler ist bei der Extraktion der Ergebnisse aufgetreten: {type(e).__name__}", exc_info=True) - self._save_debug_artifacts() - return [] - def close(self): if self.driver: logger.info("Schließe den WebDriver.")