fix: exclude internal comment-links; add initial external domain whitelist

- extractor.py: _find_comment_links() liefert nur noch externe Links.
  Interne Links in Kommentaren sind CMS-Artefakte (auskommentierte
  Navigations-Fragmente), keine SEO-Spam-Indikatoren.
- allowed_external.yaml: 36 legitime externe Domains nach initialem
  Crawl von bredelar.info manuell geprüft und eingetragen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Your Name 2026-06-12 01:15:58 +02:00
commit 5d52db6eed
2 changed files with 60 additions and 18 deletions

View file

@ -1,18 +1,52 @@
# Whitelist erlaubter externer Domains
#
# Jede externe Domain, die auf der Website verlinkt ist, muss hier eingetragen sein.
# Whitelist erlaubter externer Domains — bredelar.info
# Erstellt nach initialem Crawl und manueller Sichtprüfung am 2026-06-12.
# Neue externe Domains, die NICHT hier stehen, lösen einen Alarm aus.
#
# Format: eine Domain pro Zeile (ohne Protokoll)
# Beispiele:
# Häufig verwendete externe Ressourcen — nur eintragen, was wirklich genutzt wird:
# - fonts.googleapis.com
# - fonts.gstatic.com
# - cdnjs.cloudflare.com
# - maps.googleapis.com
# - www.google-analytics.com
# - www.googletagmanager.com
# Lokale Vereine, Institutionen, Betriebe
- www.bergbauspuren-bredelar.de
- www.bergbauspuren.de
- www.kloster-bredelar.de
- www.schuetzen-bredelar.de
- www.klosterschuetzen-bredelar.de
- www.bsg-bredelar.de
- www.sg-hoppecketal.de
- www.sg-hoppecketal-padberg.de
- www.feuerwehrhütte-bredelar.de
- www.lesdurs-mc.de
- www.kantorei-marsberg.de
- www.tourismus-marsberg.de
- www.katholische-kirche-marsberg.de
- www.marsberg.ekvw.de
# Für bredelar.info: Bitte nach erstem `init` prüfen und befüllen.
# Vorerst leer = alle externen Links lösen Alarm aus.
# Lokale Unternehmen (Gewerbetreibende aus bredelar.info/companies/)
- www.VolksbankMarsberg.de
- www.borghoff-bredelar.de
- www.dachdeckermarsberg.de
- www.maler-luce.de
- www.pyls-pflasterbau.de
# Technische Ressourcen (Fonts, CDN, Wetter-Widget)
- fonts.googleapis.com
- fonts.gstatic.com
- cdnjs.cloudflare.com
- www.wetter.com
- static1.wetter.com
# Datenschutzerklärung / Impressum (gesetzlich vorgeschriebene Links)
- ec.europa.eu
- www.e-recht24.de
- www.heise.de
- www.ratgeberrecht.eu
- www.privacyshield.gov
- policies.google.com
- www.google.com
- adssettings.google.com
- developers.facebook.com
- www.facebook.com
- twitter.com
# Webentwickler / Technischer Betreiber
- www.antillu.de
# www-Variante der eigenen Domain (wird intern verlinkt)
- www.bredelar.info

View file

@ -303,10 +303,18 @@ def _extract_jsonld(soup: BeautifulSoup) -> list[dict]:
# ---------------------------------------------------------------------------
def _find_comment_links(html: str, base_url: str) -> list[str]:
"""Find URLs hidden inside HTML comments."""
"""
Find external URLs hidden inside HTML comments.
Internal links are excluded CMS templates routinely comment out
navigation fragments that link back to the same domain.
"""
base_netloc = urlparse(base_url).netloc
found: list[str] = []
for comment in re.findall(r"<!--(.*?)-->", html, re.S):
for href in re.findall(r'href=["\']([^"\']+)["\']', comment, re.I):
if href.startswith(("http://", "https://", "/")):
found.append(urljoin(base_url, href))
if not href.startswith(("http://", "https://")):
continue
if urlparse(href).netloc == base_netloc:
continue # internal comment link — CMS artifact, not a threat
found.append(href)
return found