From 76eb026faada6dde948a2c0d303ee873901145ce Mon Sep 17 00:00:00 2001 From: Floke Date: Fri, 1 Aug 2025 11:23:42 +0000 Subject: [PATCH] helpers.py aktualisiert --- helpers.py | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/helpers.py b/helpers.py index 84bd4a61..a1d47e8e 100644 --- a/helpers.py +++ b/helpers.py @@ -210,62 +210,48 @@ def simple_normalize_url(url): """ Bereinigt und normalisiert eine URL auf die reine Domain (z.B. 'example.com'). Entfernt 'www.', Protokolle, Pfade und Query-Parameter. - NEU v2.1: Behandelt unsichtbare Zeichen und internationale Domains (Umlaute) korrekt. + NEU v2.2: Behandelt unsichtbare Zeichen, internationale Domains und typische URL-Syntaxfehler. """ logger = logging.getLogger(__name__) if not url or not isinstance(url, str): return "k.A." - # 1. Bereinige unsichtbare Zeichen, die oft Probleme machen - # \u200b = zero-width space, \xad = soft hyphen url = url.replace('\u200b', '').replace('\xad', '').strip() if not url or url.lower() == 'k.a.': return "k.A." - # 2. Füge ein Protokoll hinzu, falls es fehlt, damit urlparse funktioniert if not re.match(r'^(http|https)://', url): url = "https://" + url try: parsed = urlparse(url) domain_part = parsed.netloc - if not domain_part: - logger.debug(f"URL '{url[:100]}...' konnte nicht sinnvoll geparst werden (leerer netloc).") - return "k.A." + if not domain_part: return "k.A." - # Entferne Port-Informationen domain_part = domain_part.split(":", 1)[0] - # Entferne User-Info (user@domain.com) - if '@' in domain_part: - domain_part = domain_part.split('@', 1)[1] + if '@' in domain_part: domain_part = domain_part.split('@', 1)[1] - # 3. KORRIGIERTE LOGIK: Zuerst in IDNA encodieren, dann als ASCII decodieren + # NEU: Zusätzliche Bereinigung von häufigen Syntaxfehlern VOR dem Encoding + domain_part = re.sub(r'\.+', '.', domain_part) # Ersetze multiple Punkte (z.B. '..') durch einen + domain_part = domain_part.strip('.') # Entferne Punkte am Anfang/Ende + + if not domain_part: return "k.A." # Wenn nach Bereinigung nichts übrig bleibt + try: - # Das ist der entscheidende Schritt für Umlaute etc. - # 'lübeck.de' -> b'xn--lbeck-5wa.de' (bytes) domain_part_encoded = domain_part.encode('idna') - # b'xn--lbeck-5wa.de' -> 'xn--lbeck-5wa.de' (string) domain_part = domain_part_encoded.decode('ascii') except UnicodeError as e: logger.warning(f"Konnte Domain '{domain_part[:100]}' nicht nach IDNA konvertieren: {e}") return "k.A. (Unicode-Fehler)" - # 4. Standard-Normalisierung domain_part = domain_part.lower() if domain_part.startswith("www."): domain_part = domain_part[4:] - # 5. Finale Validierung if domain_part and '.' in domain_part: - parts = domain_part.split('.') - if len(parts) > 1 and parts[-1].isalpha() and len(parts[-1]) >= 2: - return domain_part - else: - logger.debug(f"URL '{url[:100]}...' normalisiert zu '{domain_part}', aber TLD-Prüfung schlug fehl.") - return "k.A." + return domain_part else: - logger.debug(f"URL '{url[:100]}...' normalisiert zu '{domain_part}', enthält keinen Punkt oder ist leer.") - return "k.A." + return "k.A." except Exception as e: logger.error(f"Unerwarteter Fehler bei URL-Normalisierung für '{url[:100]}...': {e}")