Validierung Wiki URLs von ChatGPT
This commit is contained in:
70
helpers.py
70
helpers.py
@@ -1501,50 +1501,42 @@ def scrape_website_details(url):
|
||||
return f"k.A. (Fehler: {str(e)[:100]}...)"
|
||||
|
||||
|
||||
def is_valid_wikipedia_article_url(url_to_check, lang=None):
|
||||
def is_valid_wikipedia_article_url(url):
|
||||
"""
|
||||
Prueft, ob eine gegebene URL zu einem gueltigen, existierenden Wikipedia-Artikel fuehrt.
|
||||
Prüft, ob eine Wikipedia-URL auf einen tatsächlich existierenden Artikel verweist.
|
||||
Erkennt "red links" (nicht existierende Seiten), die trotzdem Status 200 zurückgeben.
|
||||
"""
|
||||
logger = logging.getLogger(__name__)
|
||||
if not url_to_check or not isinstance(url_to_check, str) or "wikipedia.org/wiki/" not in url_to_check.lower():
|
||||
logger.debug(f"is_valid_wikipedia_article_url: Ungueltige URL-Struktur: {url_to_check[:100]}...")
|
||||
if not url or not "wikipedia.org/wiki/" in url.lower():
|
||||
return False
|
||||
|
||||
original_lang = None
|
||||
if lang:
|
||||
try:
|
||||
original_lang = wikipedia.get_lang()
|
||||
wikipedia.set_lang(lang)
|
||||
logger.debug(f"Temporaer Wikipedia-Sprache auf '{lang}' gesetzt für Validierung.")
|
||||
except Exception as e_lang:
|
||||
logger.warning(f"Konnte Wikipedia-Sprache nicht auf '{lang}' setzen für Validierung: {e_lang}")
|
||||
|
||||
is_valid = False
|
||||
|
||||
headers = {"User-Agent": random.choice(USER_AGENTS)}
|
||||
try:
|
||||
title_part = url_to_check.split('/wiki/', 1)[1].split('#')[0]
|
||||
title = unquote(title_part).replace('_', ' ')
|
||||
logger.debug(f"Validiere Wikipedia-Artikel: '{title[:100]}...' (URL: {url_to_check[:100]}...)")
|
||||
page = wikipedia.page(title, auto_suggest=False, preload=True)
|
||||
is_valid = True
|
||||
logger.debug(f" -> Artikel '{title[:100]}...' scheint valide zu sein (Seite geladen).")
|
||||
except wikipedia.exceptions.PageError:
|
||||
logger.debug(f" -> Seite '{title[:100]}...' nicht gefunden (PageError).")
|
||||
is_valid = False
|
||||
except wikipedia.exceptions.DisambiguationError:
|
||||
logger.debug(f" -> Seite '{title[:100]}...' ist eine Begriffsklaerungsseite.")
|
||||
is_valid = False
|
||||
except Exception as e:
|
||||
logger.error(f" -> Unerwarteter Fehler bei Validierung von '{title[:100]}...': {type(e).__name__} - {e}")
|
||||
logger.debug(traceback.format_exc())
|
||||
is_valid = False
|
||||
finally:
|
||||
if original_lang:
|
||||
try:
|
||||
wikipedia.set_lang(original_lang)
|
||||
logger.debug(f"Wikipedia-Sprache zurueck auf '{original_lang}' gesetzt.")
|
||||
except Exception as e_lang_reset:
|
||||
logger.warning(f"Konnte Wikipedia-Sprache nicht zurueck auf '{original_lang}' setzen: {e_lang_reset}")
|
||||
return is_valid
|
||||
# GET-Request ist nötig, um Weiterleitungen zu folgen
|
||||
response = requests.get(url, timeout=7, allow_redirects=True, headers=headers)
|
||||
|
||||
# 1. Primär-Check: Prüfe die finale URL auf den 'redlink=1' Parameter
|
||||
if 'action=edit&redlink=1' in response.url:
|
||||
logger.warning(f"URL-Check fehlgeschlagen (redlink=1): {url[:100]}")
|
||||
return False
|
||||
|
||||
# 2. Sekundär-Check: Prüfe auf Status-Code und typische "Seite existiert nicht"-Texte
|
||||
if response.status_code == 200:
|
||||
content_lower = response.text.lower()
|
||||
# Deutsche und englische Phrasen für nicht-existente Seiten
|
||||
if "diese seite existiert nicht" in content_lower or "wikipedia does not have an article with this exact name" in content_lower:
|
||||
logger.warning(f"URL-Check fehlgeschlagen (Text 'Seite existiert nicht' gefunden): {url[:100]}")
|
||||
return False
|
||||
|
||||
logger.debug(f"URL-Check erfolgreich (200 OK, kein Redlink): {url[:100]}")
|
||||
return True
|
||||
else:
|
||||
logger.warning(f"URL-Check fehlgeschlagen (Status {response.status_code}): {url[:100]}")
|
||||
return False
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
logger.warning(f"URL-Check fehlgeschlagen (Request-Fehler): {url[:100]} - {e}")
|
||||
return False
|
||||
|
||||
# ==============================================================================
|
||||
# 12. ALIGNMENT DEMO UTILITY
|
||||
|
||||
Reference in New Issue
Block a user