helpers.py aktualisiert
This commit is contained in:
36
helpers.py
36
helpers.py
@@ -210,62 +210,48 @@ def simple_normalize_url(url):
|
|||||||
"""
|
"""
|
||||||
Bereinigt und normalisiert eine URL auf die reine Domain (z.B. 'example.com').
|
Bereinigt und normalisiert eine URL auf die reine Domain (z.B. 'example.com').
|
||||||
Entfernt 'www.', Protokolle, Pfade und Query-Parameter.
|
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__)
|
logger = logging.getLogger(__name__)
|
||||||
if not url or not isinstance(url, str):
|
if not url or not isinstance(url, str):
|
||||||
return "k.A."
|
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()
|
url = url.replace('\u200b', '').replace('\xad', '').strip()
|
||||||
if not url or url.lower() == 'k.a.':
|
if not url or url.lower() == 'k.a.':
|
||||||
return "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):
|
if not re.match(r'^(http|https)://', url):
|
||||||
url = "https://" + url
|
url = "https://" + url
|
||||||
|
|
||||||
try:
|
try:
|
||||||
parsed = urlparse(url)
|
parsed = urlparse(url)
|
||||||
domain_part = parsed.netloc
|
domain_part = parsed.netloc
|
||||||
if not domain_part:
|
if not domain_part: return "k.A."
|
||||||
logger.debug(f"URL '{url[:100]}...' konnte nicht sinnvoll geparst werden (leerer netloc).")
|
|
||||||
return "k.A."
|
|
||||||
|
|
||||||
# Entferne Port-Informationen
|
|
||||||
domain_part = domain_part.split(":", 1)[0]
|
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:
|
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')
|
domain_part_encoded = domain_part.encode('idna')
|
||||||
# b'xn--lbeck-5wa.de' -> 'xn--lbeck-5wa.de' (string)
|
|
||||||
domain_part = domain_part_encoded.decode('ascii')
|
domain_part = domain_part_encoded.decode('ascii')
|
||||||
except UnicodeError as e:
|
except UnicodeError as e:
|
||||||
logger.warning(f"Konnte Domain '{domain_part[:100]}' nicht nach IDNA konvertieren: {e}")
|
logger.warning(f"Konnte Domain '{domain_part[:100]}' nicht nach IDNA konvertieren: {e}")
|
||||||
return "k.A. (Unicode-Fehler)"
|
return "k.A. (Unicode-Fehler)"
|
||||||
|
|
||||||
# 4. Standard-Normalisierung
|
|
||||||
domain_part = domain_part.lower()
|
domain_part = domain_part.lower()
|
||||||
if domain_part.startswith("www."):
|
if domain_part.startswith("www."):
|
||||||
domain_part = domain_part[4:]
|
domain_part = domain_part[4:]
|
||||||
|
|
||||||
# 5. Finale Validierung
|
|
||||||
if domain_part and '.' in domain_part:
|
if domain_part and '.' in domain_part:
|
||||||
parts = domain_part.split('.')
|
return domain_part
|
||||||
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."
|
|
||||||
else:
|
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:
|
except Exception as e:
|
||||||
logger.error(f"Unerwarteter Fehler bei URL-Normalisierung für '{url[:100]}...': {e}")
|
logger.error(f"Unerwarteter Fehler bei URL-Normalisierung für '{url[:100]}...': {e}")
|
||||||
|
|||||||
Reference in New Issue
Block a user