- Konu sahibi
- #1
Sitemap dosyasından URL çıkarma
Sitemap dosyasındaki URL’leri çıkarmanın en güvenilir yolu, XML içindeki
<loc> alanlarını okumaktır. Tek bir sitemap için <urlset> altındaki değerler alınır; dosya bir sitemap index ise <sitemapindex> içindeki sitemap dosyaları açılır ve onların URL’leri de toplanır. Aşağıdaki Python örneği bu iki yapıyı destekler ve her URL’yi ayrı satıra yazdırır.Sitemap yapısı nasıl çalışır?
Normal bir sitemap kabaca
<urlset> köküne sahiptir:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://example.com/</loc></url>
<url><loc>https://example.com/urun/ornek</loc></url>
</urlset>
Çok sayıda sitemap kullanıldığında ana dosya sitemap index olur. Bu dosyada doğrudan sayfa URL’leri yerine başka sitemap dosyalarının adresleri bulunur. Bu nedenle yalnızca ilk dosyanın
<loc> değerlerini almak, index dosyasında sayfa URL’lerini değil alt sitemap adreslerini döndürür.Çalıştırılabilir Python örneği
Ön koşul olarak Python 3 kurulu olmalı ve sitemap adresine erişilebilmelidir. Örnek, bildiğiniz/güvendiğiniz sitemap dosyaları içindir ve dosyayı belleğe alır; çok büyük envanterlerde akışla okuyan, dosya ve toplam istek sınırı olan bir çözüm tercih edin. Aşağıdaki kodu
sitemap_url_cikar.py adıyla kaydedin. Argüman olarak yerel dosya yolu veya HTTP/HTTPS sitemap adresi verebilirsiniz.
Python:
import gzip
import sys
import urllib.request
import xml.etree.ElementTree as ET
visited = set()
def read_data(target):
if target.startswith(("http://", "https://")):
with urllib.request.urlopen(target, timeout=30) as response:
data = response.read()
else:
with open(target, "rb") as file:
data = file.read()
if data[:2] == b"\x1f\x8b":
data = gzip.decompress(data)
return data
def local_name(tag):
return tag.rsplit("}", 1)[-1]
def loc_value(element):
for child in element:
if local_name(child.tag) == "loc" and child.text:
return child.text.strip()
return None
def extract(target):
if target in visited:
return
visited.add(target)
root = ET.fromstring(read_data(target))
root_type = local_name(root.tag)
if root_type == "sitemapindex":
for item in root:
if local_name(item.tag) == "sitemap":
child_target = loc_value(item)
if child_target:
if not child_target.startswith(("http://", "https://")):
raise ValueError("Alt sitemap adresi mutlak HTTP/HTTPS URL olmalı.")
extract(child_target)
elif root_type == "urlset":
for item in root:
if local_name(item.tag) == "url":
url = loc_value(item)
if url:
print(url)
else:
raise ValueError("Dosya sitemap XML'i veya sitemap index değil.")
if len(sys.argv) != 2:
raise SystemExit("Kullanım: python sitemap_url_cikar.py sitemap.xml")
try:
extract(sys.argv[1])
except (OSError, ValueError, EOFError, ET.ParseError) as error:
raise SystemExit(f"Sitemap okunamadı: {error}")
Çalıştırma örneği:
Bash:
python sitemap_url_cikar.py https://example.com/sitemap.xml
Başarılı sonuçta her satırda bir URL görürsünüz:
Kod:
https://example.com/
https://example.com/urun/ornek
Yerel dosya kullanacaksanız komut şu şekilde olur:
Bash:
python sitemap_url_cikar.py sitemap.xml > url-listesi.txt
url-listesi.txt boş kalıyorsa dosya geçerli bir <urlset> içermiyor olabilir, sitemap index alt dosyalarına erişilemiyor olabilir veya XML’de <loc> değeri bulunmuyor olabilir. XML ayrıştırma hatası alırsanız dosyanın eksik, bozuk ya da XML kurallarına aykırı olduğunu kontrol edin.Hangi dosyadan ne çıkarılır?
Sitemap türünü doğru belirlemek, çıktıyı yanlış yorumlamamanızı sağlar.
| Dosya türü | Kök öğe | Çıkarılan değer |
|---|---|---|
| Tek sitemap | <urlset> | Sayfa URL’leri |
| Sitemap index | <sitemapindex> | Alt sitemap adresleri; kod alt dosyaları izleyerek sayfa URL’lerini toplar |
| Sıkıştırılmış sitemap | .xml.gz | Açıldıktan sonra aynı <loc> değerleri |
Çıktıyı SEO denetiminde kullanacaksanız önce tekrarları temizleyin ve URL’lerin hangi sitemap’tan geldiğini kaybetmek istemiyorsanız dosyaları ayrı ayrı çalıştırın. Sitemap’tan URL çıkarmak yalnızca dosyada beyan edilen adresleri listeler; adresin erişilebilir, indekslenmiş veya arama sonuçlarında sıralanıyor olduğunu kanıtlamaz. Sonraki kontrolde HTTP durum kodu, yönlendirme, robots kuralları ve sayfanın gerçek içeriği ayrıca incelenmelidir.
Sık sorulan sorular
Aynı URL birden fazla sitemap’ta varsa ne yapmalıyım?
Tekilleştirilmiş bir liste kullanın. Aynı URL’nin birden fazla dosyada bulunması, çıkarma işlemini bozmaz; ancak sayım ve denetim sonuçlarında mükerrer kayıt oluşturur.
Sitemap’tan çıkarılan URL’ler neden Google’da görünmeyebilir?
Sitemap, URL’nin keşfedilmesine yardımcı olan bir bildirimdir; indeksleme veya sıralama garantisi değildir. Görünmeme nedenini anlamak için URL’nin erişim durumunu, yönlendirmelerini, robots kurallarını ve indeksleme sinyallerini ayrıca kontrol etmek gerekir.