This commit is contained in:
2025-07-08 10:05:42 +00:00
parent eeb8450a16
commit e8957371a3

View File

@@ -235,45 +235,56 @@ class DealfrontScraper:
self._save_debug_artifacts() self._save_debug_artifacts()
return False return False
def extract_current_page_results(self): def extract_current_page_results(self):
""" """
Extrahiert die Firmennamen und Webseiten. Wenn keine Zeilen gefunden werden, Extrahiert Firmennamen und Webseiten direkt von der Seite
wird der komplette Seitenquelltext für die Analyse gespeichert. mithilfe der verifizierten, präzisen CSS-Selektoren.
""" """
try: try:
logger.info("Extrahiere Ergebnisse von der aktuellen Seite...") logger.info("Extrahiere Ergebnisse von der aktuellen Seite...")
results = [] results = []
# Warten, bis ein stabiles Element der Seite geladen ist, z.B. die Tabellenüberschrift. # Warten, bis das erste Element, das wir suchen (ein Firmenname), vorhanden ist.
header_selector = (By.XPATH, "//th[normalize-space()='Firma']") # Das ist ein stabiler Indikator, dass die Liste geladen ist.
self.wait.until(EC.visibility_of_element_located(header_selector)) company_name_selector = ".sticky-column a.t-highlight-text"
logger.info("Tabellen-Header gefunden. Warte kurz, damit die Datenzeilen rendern können...") logger.info(f"Warte auf das erste Firmenelement mit Selektor: '{company_name_selector}'")
time.sleep(5) # Großzügige Wartezeit für das Rendern der Daten 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. # === DIREKTE EXTRAKTION ALLER ELEMENTE MIT IHREN SELEKTOREN ===
rows_selector = (By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") company_elements = self.driver.find_elements(By.CSS_SELECTOR, company_name_selector)
rows = self.driver.find_elements(*rows_selector) website_elements = self.driver.find_elements(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text")
if not rows: logger.info(f"{len(company_elements)} Firmennamen und {len(website_elements)} Webseiten-Elemente gefunden.")
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 if not company_elements:
logger.warning("Keine Firmen mit dem angegebenen Selektor gefunden. Speichere Debug-Artefakte.")
self._save_debug_artifacts() self._save_debug_artifacts()
logger.warning("HTML-Dump wurde erstellt. Breche die Extraktion ab.")
return [] return []
logger.info(f"{len(rows)} Firmen-Datenzeilen zur Verarbeitung gefunden.") # Wir iterieren über die gefundenen Firmen-Elemente
for i, company_element in enumerate(company_elements):
# (Der Rest der Extraktionslogik bleibt wie zuvor)
for i, row in enumerate(rows, 1):
try: try:
company_name = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text").get_attribute("title").strip() # Firmenname aus dem 'title'-Attribut extrahieren (verhindert abgeschnittenen Text)
website = row.find_element(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text").text.strip() company_name = company_element.get_attribute("title").strip()
results.append({'name': company_name, 'website': website})
# 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: 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 continue
logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen gefunden.") logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen erfolgreich zugeordnet.")
return results return results
except Exception as e: except Exception as e: