+ soup.find(class_='content') # Oder
+ # Füge ggf. weitere spezifische Selektoren hinzu, die du oft siehst + ) if content_area: - # Extrahiere Text, trenne mit Leerzeichen, entferne überflüssigen Whitespace + debug_print(f"Gezielten Inhaltsbereich gefunden ({content_area.name}#{content_area.get('id')} oder .{content_area.get('class')}) für {url}") + else: + # --- Fallback: Body nehmen, ABER Banner versuchen zu entfernen --- + debug_print(f"Kein spezifischer Inhaltsbereich gefunden für {url}. Nutze Body und versuche Banner zu entfernen.") + content_area = soup.find('body') + if content_area: + # Versuche, häufige Cookie-Banner Strukturen zu entfernen + banner_selectors = [ + '[id*="cookie"]', # IDs die "cookie" enthalten + '[class*="cookie"]', # Klassen die "cookie" enthalten + '[id*="consent"]', # IDs die "consent" enthalten + '[class*="consent"]', # Klassen die "consent" enthalten + '[id*="banner"]', # IDs die "banner" enthalten (vorsichtig!) + '[class*="banner"]', # Klassen die "banner" enthalten (vorsichtig!) + '[role="dialog"]' # Oft für Popups/Banner genutzt (vorsichtig!) + ] + banners_removed_count = 0 + for selector in banner_selectors: + try: + potential_banners = content_area.select(selector) + for banner in potential_banners: + # Zusätzliche Prüfung: Enthält das Element typischen Banner-Text? + banner_text = banner.get_text(" ", strip=True).lower() + keywords = ["cookie", "zustimm", "ablehnen", "einverstanden", "datenschutz", "privacy", "akzeptier"] + if any(keyword in banner_text for keyword in keywords): + debug_print(f"Entferne potenzielles Banner ({selector}) mit Text: {banner_text[:100]}...") + banner.decompose() # Entferne das Element aus dem Baum + banners_removed_count += 1 + except Exception as e_select: + debug_print(f"Fehler beim Versuch Banner mit Selektor '{selector}' zu entfernen: {e_select}") + if banners_removed_count > 0: + debug_print(f"{banners_removed_count} potenzielle Banner-Elemente entfernt.") + + # --- Text extrahieren aus gefundenem Bereich (oder Body) --- + if content_area: + for script_or_style in content_area(["script", "style"]): # Skripte/Styles entfernen + script_or_style.decompose() + text = content_area.get_text(separator=' ', strip=True) text = re.sub(r'\s+', ' ', text) # Normalisiere Whitespace + + # --- Zusätzliche Prüfung: Ist der extrahierte Text *nur* Banner-Text? --- + banner_keywords_strict = ["cookie", "zustimmen", "ablehnen", "einverstanden", "datenschutz", "privacy", "akzeptier", "einstellung", "partner", "analyse", "marketing"] + text_lower = text.lower() + keyword_hits = sum(1 for keyword in banner_keywords_strict if keyword in text_lower) + + # Heuristik: Wenn der Text kurz ist UND viele Banner-Keywords enthält -> Verwerfen + if len(text) < 500 and keyword_hits >= 3: + debug_print(f"WARNUNG: Extrahierter Text für {url} scheint nur Cookie-Banner zu sein (Länge {len(text)}, {keyword_hits} Keywords). Verwerfe Text.") + return "k.A. (Nur Cookie-Banner erkannt)" + result = text[:max_length] debug_print(f"Website {url} erfolgreich gescrapt. Extrahierter Text (Länge {len(result)}): {result[:100]}...") return result else: - debug_print(f"Kein oder
Tag gefunden in {url}") + debug_print(f"Kein oder spezifischer Inhaltsbereich gefunden in {url}") return "k.A." except requests.exceptions.SSLError as e: - debug_print(f"SSL-Fehler beim Abrufen der Website {url}: {e}. Versuche ohne Zertifikatsprüfung...") - # Erneuter Versuch ohne Verifizierung - if verify_cert: # Nur wenn der erste Versuch mit Verifizierung war - return get_website_raw(url, max_length, verify_cert=False) - else: - return "k.A." # Wenn auch ohne Verifizierung Fehler auftritt + debug_print(f"SSL-Fehler beim Abrufen der Website {url}: {e}. Versuche ohne Zertifikatsprüfung...") + if verify_cert: + return get_website_raw(url, max_length, verify_cert=False) + else: + return "k.A." except requests.exceptions.RequestException as e: debug_print(f"Netzwerk-/HTTP-Fehler beim Abrufen der Website {url}: {e}") return "k.A."