hreflang hatalarını Python ile denetlemek

hreflang'in en sık bozulan kuralı şu: bağlantılar karşılıklı olmalı. A sayfası B'yi gösteriyorsa, B de A'yı göstermeli. Göstermiyorsa arama motoru ikisini de görmezden gelebilir.

Elle kontrol etmek on sayfada eğlenceli, bin sayfada değil.

hreflang_check.py
import re
import requests
from collections import defaultdict

VALID = re.compile(r"^([a-z]{2,3})(-[A-Za-z]{2}|-[0-9]{3})?$|^x-default$")

def hreflangs(url: str) -> dict[str, str]:
    html = requests.get(url, timeout=15, headers={"User-Agent": "hreflang-check"}).text
    pairs = re.findall(r'<link[^>]+hreflang="([^"]+)"[^>]+href="([^"]+)"', html)
    pairs += [(h, u) for u, h in re.findall(r'<link[^>]+href="([^"]+)"[^>]+hreflang="([^"]+)"', html)]
    return {lang: href for lang, href in pairs}

def audit(start_urls: list[str]) -> None:
    graph = {u: hreflangs(u) for u in start_urls}
    for url, links in graph.items():
        if "x-default" not in links:
            print(f"[uyarı] x-default yok: {url}")
        for lang, target in links.items():
            if not VALID.match(lang):
                print(f"[hata] geçersiz dil kodu '{lang}': {url}")
            back = graph.get(target) or hreflangs(target)
            if url not in back.values():
                print(f"[hata] karşılık yok: {url} -> {target} ({lang})")

audit([
    "https://ornek.com/tr/",
    "https://ornek.com/en/",
    "https://ornek.com/de/",
])

En sık gördüğüm hatalar

  1. en-UK yazmak. Doğrusu en-GB.
  2. Sadece ülke kodu kullanmak (-TR gibi). Dil kodu zorunlu, ülke isteğe bağlı: tr-TR ya da sadece tr.
  3. hreflang'in gösterdiği sayfanın canonical'ının başka bir yeri göstermesi. Bu durumda hreflang boşa gider.

Betiği bir kez çalıştırmak, aylarca "neden yanlış ülkede çıkıyoruz" diye düşünmekten daha kısa sürüyor.

Comments / questions

There's no comment section here. If you have a question or want to add something, message me on Telegram or send an email to [email protected]. Thanks!

Related pages