From e13ee0f9a6c4542c1d438ab6a4d2b599966a70ae Mon Sep 17 00:00:00 2001 From: Floke Date: Fri, 30 May 2025 13:31:34 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 76 ++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 45 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index b2d5809bf..19f5ca4fb 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -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):