From e82da740a04428491896b8908ceb9ffeafd72b90 Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 29 May 2025 12:22:08 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 0a371723..c9f9fba0 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -2434,23 +2434,28 @@ def scrape_website_details(url): logger.warning(f"Ausführe 'scrape_website_details' fuer URL {url[:100]}...") # Logge den Start auf Warning - try: - # 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): - # Führen Sie die GET-Anfrage aus. Der retry_on_failure Decorator behandelt RequestsExceptions. - # Timeout sollte aus Config kommen. Standardmaessig pruefen wir SSL-Zertifikate. - response = requests.get(target_url, timeout=getattr(Config, 'REQUEST_TIMEOUT', 15), verify=True) #verify=True Standard - # Wirft HTTPError fuer 4xx/5xx Antworten. Wird vom Decorator gefangen und (je nach Status) behandelt. - response.raise_for_status() - # Versuchen Sie, das Encoding zu erraten - response.encoding = response.apparent_encoding - # Parsen Sie den HTML-Inhalt - return BeautifulSoup(response.text, getattr(Config, 'HTML_PARSER', 'html.parser')) + try: + # 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): + # --- START DES NEUEN/ERSETZTEN BLOCKS --- + if not target_url or not isinstance(target_url, str): # Zusätzliche Prüfung + logger.error(f"get_soup_for_details: Ungültige URL '{target_url}' erhalten.") + raise ValueError("Ungültige URL für get_soup_for_details") # Damit retry greift oder als Fehler propagiert wird - # Rufen Sie die Hilfsfunktion auf, um das Soup-Objekt zu erhalten - soup = get_soup_for_details(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 + + 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 --- + + # Rufen Sie die Hilfsfunktion auf, um das Soup-Objekt zu erhalten + soup = get_soup_for_details(url) # Wenn das Soup-Objekt erfolgreich erhalten wurde if soup: @@ -4686,7 +4691,7 @@ class DataProcessor: if not self._get_cell_value_safe(row_data, "Wikipedia Timestamp").strip(): grund_message_parts_wiki.append('Z (Wikipedia Timestamp) leer') if self._get_cell_value_safe(row_data, "Chat Wiki Konsistenzpruefung").strip().upper() == "X (URL COPIED)": grund_message_parts_wiki.append("AC (Chat Wiki Konsistenzpruefung)='X (URL COPIED)'") grund_message_wiki = ", ".join(filter(None, grund_message_parts_wiki)) or "Unbekannter Grund (Wiki)" - self.logger.info(f"Zeile {row_num_in_sheet}: Fuehre WIKI Schritte aus (Grund: {grund_message_wiki})...") + self.logger.info(f"Zeile {row_num_in_sheet}: Fuehre WIKI Schritte aus (Grund: {grund_message_wiki})...")) # Hole aktuellen Wiki-URL der Tochter aus Spalte R current_wiki_url_in_sheet_for_daughter = self._get_cell_value_safe(row_data, "Wiki URL").strip()