From 7f9f43936a88d6fbc2bd6dbf828da539cd90661d Mon Sep 17 00:00:00 2001 From: Floke Date: Sun, 13 Jul 2025 14:43:59 +0000 Subject: [PATCH] dealfront_enrichment.py aktualisiert --- dealfront_enrichment.py | 50 +++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index f2e51a04..770910db 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -141,14 +141,16 @@ class DealfrontScraper: logger.info(f"--- Verarbeite Seite {page_number} ---") self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table"))) - # Vor dem Klick: Erste Zeilen-ID merken (oder Text, falls keine ID vorhanden) + # Vor dem Klick: Erste Zeilen-ID und Text merken try: first_row_element = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") first_row_id = first_row_element.get_attribute("id") - logger.debug(f"Vor Pagination: Erste Zeilen-ID ist {first_row_id}") - except Exception: + first_row_text = first_row_element.text.strip() + logger.info(f"Vor Pagination: Erste Zeilen-ID: {first_row_id}, Text: '{first_row_text}'") + except Exception as e: first_row_id = None - logger.debug("Vor Pagination: Keine Zeilen-ID gefunden.") + first_row_text = None + logger.warning(f"Vor Pagination: Keine Zeilen-ID gefunden: {e}") # Extrahiere aktuelle Seite page_results = self.extract_current_page_results() @@ -172,10 +174,11 @@ class DealfrontScraper: # Suche nach dem Weiter-Button next_button = None - for btn in buttons: + for idx, btn in enumerate(buttons): btn_html = btn.get_attribute('outerHTML') if ("svg" in btn_html) and ("disabled" not in btn.get_attribute('class')) and (btn.text.strip() == ""): next_button = btn + logger.info(f"Als Weiter-Button erkannt: Button {idx}") break if not next_button: @@ -193,17 +196,28 @@ class DealfrontScraper: self.driver.execute_script("arguments[0].click();", next_button) logger.info("Klick auf Weiter-Button ausgeführt.") - # Warten, bis die erste Zeile eine andere ID hat (also wirklich neue Seite geladen ist) - if first_row_id: - self.wait.until( - lambda d: d.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]").get_attribute("id") != first_row_id - ) - logger.info("Seitenwechsel erfolgreich verifiziert (erste Zeile hat neue ID).") - else: - time.sleep(2) # Fallback, falls keine ID gefunden wurde + # Warte auf neue Seite: Änderung der ID ODER Änderung des Texts der ersten Zeile + def page_changed(driver): + try: + row = driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") + row_id = row.get_attribute("id") + row_text = row.text.strip() + logger.debug(f"Nach Pagination: Erste Zeilen-ID: {row_id}, Text: '{row_text}'") + if first_row_id and row_id != first_row_id: + return True + if first_row_text and row_text != first_row_text: + return True + return False + except Exception as e: + logger.warning(f"Fehler beim Vergleichen der ersten Zeile nach Pagination: {e}") + return False + + self.wait.until(page_changed) + logger.info("Seitenwechsel erfolgreich verifiziert (erste Zeile hat neue ID oder neuen Text).") + except Exception as e: logger.error(f"Fehler beim Klicken auf den Weiter-Button oder beim Warten auf neue Seite: {e}") - # Optional: Screenshot und HTML speichern + # Screenshot und HTML speichern try: timestamp = time.strftime("%Y%m%d-%H%M%S") self.driver.save_screenshot(f"/app/output/pagination_error_{timestamp}.png") @@ -212,6 +226,14 @@ class DealfrontScraper: logger.info(f"Screenshot und HTML der Seite nach Pagination-Fehler gespeichert.") except Exception as ee: logger.error(f"Fehler beim Speichern von Screenshot/HTML: {ee}") + # Zusätzlich: Logge alle Zeilen nach dem Fehler + try: + all_rows = self.driver.find_elements(By.CSS_SELECTOR, "table#t-result-table tbody tr") + logger.info(f"Nach Pagination-Fehler: Es sind {len(all_rows)} Zeilen im DOM.") + for i, r in enumerate(all_rows): + logger.info(f"Zeile {i}: Text='{r.text.strip()}', HTML={r.get_attribute('outerHTML')}") + except Exception as eee: + logger.error(f"Fehler beim Loggen der Zeilen nach Fehler: {eee}") break return all_companies