bugfix
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user