This commit is contained in:
2025-05-30 13:31:34 +00:00
parent d81658ee3b
commit e13ee0f9a6

View File

@@ -2433,70 +2433,56 @@ def scrape_website_details(url):
logger.warning(f"Ausführe 'scrape_website_details' fuer URL {url[:100]}...") # Logge den Start auf Warning
try: # <<< KORREKTE EINRÜCKUNG (auf gleicher Ebene wie logger.warning darüber)
try: # Beginn des try-Blocks
# Hilfsfunktion zum Abrufen des Soup-Objekts mit Retry.
# Nutzt retry_on_failure, requests, BeautifulSoup, Config.
@retry_on_failure
def get_soup_for_details(target_url):
if not target_url or not isinstance(target_url, str):
logger.error(f"get_soup_for_details: Ungültige URL '{target_url}' erhalten.")
raise ValueError(f"Ungültige URL für get_soup_for_details: {target_url}")
@retry_on_failure
def get_soup_for_details(target_url):
if not target_url or not isinstance(target_url, str):
logger.error(f"get_soup_for_details: Ungültige URL '{target_url}' erhalten.")
raise ValueError(f"Ungültige URL für get_soup_for_details: {target_url}")
if not target_url.lower().startswith(("http://", "https://")):
logger.debug(f"get_soup_for_details: Füge 'https://' zu URL '{target_url}' hinzu.")
target_url = "https://" + target_url # Schema hinzufügen
response = requests.get(target_url, timeout=getattr(Config, 'REQUEST_TIMEOUT', 15), verify=True)
response.raise_for_status()
response.encoding = response.apparent_encoding
return BeautifulSoup(response.text, getattr(Config, 'HTML_PARSER', 'html.parser'))
# --- ENDE DES NEUEN/ERSETZTEN BLOCKS ---
if not target_url.lower().startswith(("http://", "https://")):
logger.debug(f"get_soup_for_details: Füge 'https://' zu URL '{target_url}' hinzu.")
target_url = "https://" + target_url
response = requests.get(target_url, timeout=getattr(Config, 'REQUEST_TIMEOUT', 15), verify=True)
response.raise_for_status()
response.encoding = response.apparent_encoding
return BeautifulSoup(response.text, getattr(Config, 'HTML_PARSER', 'html.parser'))
# Ende der Definition von get_soup_for_details
# Rufen Sie die Hilfsfunktion auf, um das Soup-Objekt zu erhalten
soup = get_soup_for_details(url) # Der Aufruf von get_soup_for_details
if soup:
# Diese Zeile muss auf derselben Einrückungsebene wie die @retry_on_failure Zeile sein,
# da sie die nächste Anweisung innerhalb des try-Blocks nach der Funktionsdefinition ist.
soup = get_soup_for_details(url) # Korrekte Einrückung (innerhalb des try-Blocks)
if soup: # Korrekte Einrückung (innerhalb des try-Blocks)
# --- Extrahiere spezifische Details ---
# Versuchen Sie, wichtige Meta-Informationen zu extrahieren.
title = soup.find('title') # Titel-Tag
meta_desc = soup.find('meta', attrs={'name': 'description'}) # Meta Description
h1 = soup.find('h1') # Erstes H1-Tag
title = soup.find('title')
meta_desc = soup.find('meta', attrs={'name': 'description'})
h1 = soup.find('h1')
details_list = [] # Liste zum Sammeln der extrahierten Details
details_list = []
# Extrahieren und bereinigen Sie den Text (clean_text nutzt globale Funktion)
if title: details_list.append(f"Title: {clean_text(title.get_text())}")
# Pruefen Sie, ob das 'content' Attribut existiert und nicht leer ist
if meta_desc and meta_desc.get('content'): details_list.append(f"Description: {clean_text(meta_desc['content'])}")
if h1: details_list.append(f"H1: {clean_text(h1.get_text())}")
# Wenn Details gefunden wurden
if details_list:
# Verbinden Sie die Details mit einem Trennzeichen
result_string = " | ".join(details_list)
logger.debug(f"Details fuer {url[:100]}... extrahiert: {result_string[:100]}...") # Logge Ergebnis (gekuerzt)
return result_string # Gebe die extrahierten Details zurueck
logger.debug(f"Details fuer {url[:100]}... extrahiert: {result_string[:100]}...")
return result_string
else:
# Wenn keine Standard-Details gefunden wurden
logger.debug(f"Keine Standard-Details (Title, Description, H1) gefunden fuer {url[:100]}...")
return "k.A. (Keine Standard-Details gefunden)" # Gebe spezifischen Wert zurueck
return "k.A. (Keine Standard-Details gefunden)"
else:
# Wenn get_soup_for_details None zurueckgegeben hat (nach Retries fehlgeschlagen)
# Der Fehler wurde bereits in get_soup_for_details oder retry geloggt.
logger.error(f"Scraping fuer Details fehlgeschlagen nach Retries fuer {url[:100]}...") # Logge finalen Fehler
return "k.A. (Scraping fehlgeschlagen)" # Gebe spezifischen Fehlerwert zurueck
logger.error(f"Scraping fuer Details fehlgeschlagen nach Retries fuer {url[:100]}...")
return "k.A. (Scraping fehlgeschlagen)"
# Fangen Sie alle anderen verbleibenden Exceptions ab (sollten selten sein)
# retry_on_failure auf get_soup_for_details behandelt die meisten Netzwerk-/HTTP-Fehler.
except Exception as e:
# Logge den Fehler auf Error-Level
except Exception as e: # Dieser except-Block gehört zum äußeren try
logger.error(f"FEHLER in scrape_website_details fuer {url[:100]}...: {type(e).__name__} - {e}")
# Der Fehler wird bereits vom retry_on_failure geloggt, wenn er von get_soup_for_details kam.
# Hier wird nur ein Fehler gefangen, der aus der Logik dieser Funktion selbst kommt (z.B. Fehler beim String-Handling).
# Geben Sie einen Fehlerwert zurueck, der im Sheet gespeichert werden kann.
return f"k.A. (Fehler: {str(e)[:100]}...)" # Signalisiert Fehler (gekuerzt)
logger.debug(traceback.format_exc()) # Hinzugefügt für besseres Debugging
return f"k.A. (Fehler: {str(e)[:100]}...)"
def is_valid_wikipedia_article_url(url_to_check, lang=None):