Si administras un sitio con cientos o miles de URLs, tarde o temprano necesitas exportar tu sitemap a CSV para poder filtrar, ordenar y cruzar datos en una hoja de cálculo. El problema es que la mayoría de herramientas gratuitas online cortan la extracción en 500 páginas, y un sitemap_index.xml real casi nunca cabe en ese límite. En esta guía te muestro paso a paso cómo convertir un sitemap XML a CSV sin restricciones, usando PowerShell y Python, dos métodos 100% gratuitos que puedes correr desde tu propia computadora.
¿Qué es un sitemap_index.xml?
Un sitemap_index.xml no es un sitemap en sí mismo, sino un archivo índice que agrupa varios sitemaps más pequeños. Cuando un sitio supera cierto número de URLs (Rank Math, Yoast y la mayoría de plugins SEO lo dividen normalmente cada 1.000-50.000 URLs, o antes si hay muchas imágenes asociadas), WordPress deja de generar un único sitemap.xml y en su lugar crea un índice como este:
Ejemplo real de estructura:
sitemap_index.xml→ apunta a…post-sitemap1.xml(primer bloque de entradas)post-sitemap2.xml(segundo bloque de entradas)page-sitemap.xml(páginas estáticas)
Esto significa que cuando alguien te pide «el sitemap del sitio», en realidad necesitas procesar varios archivos XML anidados, no uno solo. Si tu objetivo es una auditoría de sitemap completa, el primer paso técnico es siempre identificar cuántos sub-sitemaps existen antes de intentar extraer nada.
Cómo identificar y procesar todos los sitemaps que contiene
Antes de escribir una sola línea de código, abre el índice en tu navegador (por ejemplo, tudominio.com/sitemap_index.xml) y localiza cada etiqueta <loc> dentro de <sitemap>. Cada una de esas URLs es un sitemap independiente que debes descargar y leer por separado.
El reto real aparece cuando ese índice tiene 3, 10 o 30 sub-sitemaps: hacerlo a mano se vuelve inviable. Por eso, tanto el script de PowerShell como el de Python que verás más abajo están diseñados para leer el índice automáticamente y recorrer cada sub-sitemap sin intervención manual, sin importar cuántos haya.
El límite de 500 páginas: por qué ocurre y cómo evitarlo
La mayoría de convertidores online gratuitos limitan la extracción a 500 URLs porque procesan el archivo en el navegador del usuario o en un servidor compartido con cuotas bajas. Si tu sitio tiene, por ejemplo, 3.000 URLs repartidas en varios sub-sitemaps, esas herramientas simplemente truncan el resultado o piden que subas plan de pago.
La forma más confiable de extraer URLs de un sitemap sin ese tope es procesar el XML directamente en tu equipo, con un lenguaje de scripting. No hay límite artificial: el único límite real es tu conexión a internet y el tamaño del archivo.
Método 1: exportar sitemap XML a CSV con PowerShell
PowerShell viene preinstalado en Windows, así que no necesitas instalar nada adicional. Este script lee el índice, recorre cada sub-sitemap y guarda todas las URLs en un archivo CSV.
Paso 1: abre PowerShell y pega el script
Reemplaza la URL del ejemplo por la de tu propio sitemap_index.xml:
$sitemapIndexUrl = "https://tudominio.com/sitemap_index.xml"
# Descarga y parsea el indice de sitemaps
[xml]$indiceXml = (Invoke-WebRequest -Uri $sitemapIndexUrl -UseBasicParsing).Content
$todasLasUrls = foreach ($subSitemap in $indiceXml.sitemapindex.sitemap) {
$subUrl = $subSitemap.loc
Write-Host "Procesando: $subUrl"
try {
[xml]$subXml = (Invoke-WebRequest -Uri $subUrl -UseBasicParsing).Content
foreach ($url in $subXml.urlset.url) {
[PSCustomObject]@{
URL = $url.loc
UltimaModif = $url.lastmod
SitemapOrigen = $subUrl
}
}
} catch {
Write-Warning "No se pudo procesar: $subUrl"
}
}
$todasLasUrls | Export-Csv -Path "sitemap_completo.csv" -NoTypeInformation -Encoding UTF8
Paso 2: revisa el archivo generado
El archivo sitemap_completo.csv se crea en la misma carpeta desde donde ejecutaste PowerShell. Ábrelo con Excel o Google Sheets: tendrás tres columnas (URL, fecha de última modificación y el sub-sitemap del que proviene), sin ningún límite de filas.
Variante práctica: cuando ya conoces la lista de sub-sitemaps
Si tu sitemap_index.xml no cambia de estructura con frecuencia (la mayoría de sitios en WordPress con Rank Math o Yoast no agregan sub-sitemaps todos los días), puedes ahorrarte la lectura automática del índice y listar directamente las URLs de los sub-sitemaps. Es más rápido, hace una petición menos y es igual de efectivo. Así lo usamos nosotros mismos para auditar:
$urls = @(
"https://tudominio.com/post-sitemap1.xml"
"https://tudominio.com/post-sitemap2.xml"
"https://tudominio.com/page-sitemap.xml"
)
$resultado = @()
foreach ($sitemap in $urls) {
Write-Host "Descargando $sitemap ..."
try {
$respuesta = Invoke-WebRequest -Uri $sitemap -UseBasicParsing
[xml]$xml = $respuesta.Content
foreach ($item in $xml.urlset.url) {
$resultado += [PSCustomObject]@{
URL = $item.loc
Ultima_Modificacion = $item.lastmod
Sitemap = $sitemap
}
}
Write-Host "OK"
}
catch {
Write-Host "ERROR: $sitemap"
Write-Host $_.Exception.Message
}
}
$archivo = "$env:USERPROFILE\Desktop\exportar-sitemap.csv"
$resultado |
Sort-Object URL -Unique |
Export-Csv -Path $archivo -NoTypeInformation -Encoding UTF8
Write-Host ""
Write-Host "================================="
Write-Host "EXPORTACION TERMINADA"
Write-Host "URLs encontradas: $($resultado.Count)"
Write-Host "Archivo: $archivo"
Write-Host "================================="
Dos detalles de este script que vale la pena copiar siempre: Sort-Object URL -Unique elimina automáticamente URLs duplicadas entre sitemaps (algo que ocurre más seguido de lo esperado), y guardar el archivo en $env:USERPROFILE\Desktop evita perderlo entre las carpetas del sistema al terminar la ejecución. Al correr este mismo script sobre nuestros tres sitemaps reales obtuvimos 258 URLs únicas listas para auditar en segundos, algo que ninguna herramienta online gratuita con tope de 500 filas hubiera limitado, pero que en sitios más grandes sí marcaría la diferencia.
Método 2: convertir sitemap XML a CSV con Python
Si prefieres Python (útil también en Mac o Linux), este script hace exactamente lo mismo usando únicamente librerías estándar más requests.
Paso 1: instala la única dependencia necesaria
pip install requests
Paso 2: guarda y ejecuta el script
import requests
import xml.etree.ElementTree as ET
import csv
NS = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}
def obtener_xml(url):
respuesta = requests.get(url, timeout=15)
respuesta.raise_for_status()
return ET.fromstring(respuesta.content)
def extraer_todas_las_urls(sitemap_index_url):
raiz = obtener_xml(sitemap_index_url)
filas = []
sub_sitemaps = raiz.findall("sm:sitemap/sm:loc", NS)
for sitemap_loc in sub_sitemaps:
sub_url = sitemap_loc.text
print(f"Procesando: {sub_url}")
try:
sub_raiz = obtener_xml(sub_url)
for url_tag in sub_raiz.findall("sm:url", NS):
loc = url_tag.find("sm:loc", NS)
lastmod = url_tag.find("sm:lastmod", NS)
filas.append({
"url": loc.text if loc is not None else "",
"ultima_modificacion": lastmod.text if lastmod is not None else "",
"sitemap_origen": sub_url
})
except Exception as error:
print(f"No se pudo procesar {sub_url}: {error}")
return filas
if __name__ == "__main__":
sitemap_index = "https://tudominio.com/sitemap_index.xml"
filas = extraer_todas_las_urls(sitemap_index)
with open("sitemap_completo.csv", "w", newline="", encoding="utf-8") as archivo:
escritor = csv.DictWriter(archivo, fieldnames=["url", "ultima_modificacion", "sitemap_origen"])
escritor.writeheader()
escritor.writerows(filas)
Este método es especialmente útil si luego quieres automatizar el proceso (por ejemplo, correrlo cada semana con una tarea programada) o combinarlo con otras librerías de análisis de datos.
Errores frecuentes al extraer URLs de un sitemap
- No procesar el índice, solo un sub-sitemap: si copias directamente la URL de
post-sitemap1.xmlen lugar delsitemap_index.xml, te faltarán todas las URLs de los demás bloques. - Ignorar el namespace XML: los sitemaps usan el namespace
http://www.sitemaps.org/schemas/sitemap/0.9. Si tu script busca etiquetas sin declararlo, no encontrará ningún resultado aunque el archivo esté bien formado. - No manejar errores de red: algunos sub-sitemaps pueden devolver error 404 o 500 temporalmente. Sin manejo de excepciones, el script completo se detiene en vez de saltar ese archivo y continuar.
- Confundir
<lastmod>con la fecha de publicación real: ese campo refleja la última modificación registrada por el CMS, no necesariamente cuándo se actualizó el contenido de forma sustancial. - Exportar sin codificación UTF-8: si tu sitio tiene tildes o ñ en las URLs o metadatos, un CSV mal codificado mostrará caracteres corruptos al abrirlo en Excel.
Usos del CSV para auditorías SEO
Tener todas las URLs en una hoja de cálculo abre la puerta a varios tipos de análisis que serían muy lentos de hacer manualmente:
Detección de URLs duplicadas o muy similares
Ordenando la columna de URLs alfabéticamente es fácil detectar patrones como dos artículos casi idénticos publicados en años distintos (un problema de canibalización muy común cuando se actualiza contenido creando una URL nueva en lugar de editar la existente).
Páginas desactualizadas
Filtra por la columna ultima_modificacion para encontrar contenido que no se toca desde hace más de 12-18 meses y priorizar qué actualizar primero.
Redirecciones y errores 404
Puedes cruzar este CSV con un crawl de Screaming Frog (o similar) para verificar que ninguna URL del sitemap devuelva un código de estado distinto a 200, algo que confunde a los buscadores si ocurre de forma masiva.
Indexabilidad
Compara el listado del sitemap contra el reporte de «Cobertura» de Google Search Console: si hay URLs en el sitemap que Google marca como excluidas, es una señal clara de que el sitemap está desincronizado con la realidad del rastreo.
Arquitectura del sitio
Al tener la lista completa en columnas, puedes segmentar por carpeta o categoría (por ejemplo, todo lo que empieza con /blog/ o /seo/) y detectar de un vistazo si alguna sección del sitio está sobre-representada o casi vacía en comparación con tu estrategia de contenidos.
Buenas prácticas para mantener el sitemap limpio
- Exporta el sitemap a CSV al menos una vez al trimestre para llevar un control histórico del crecimiento del sitio.
- Elimina del sitemap las URLs con
noindex, redirigidas o con error 404; su presencia solo desperdicia presupuesto de rastreo. - Verifica que cada sub-sitemap no supere las 50.000 URLs ni los 50 MB, según el estándar de sitemaps.org.
- Antes de crear una URL «nueva» para un tema que ya existe, revisa el CSV exportado para confirmar si no estás a punto de generar contenido duplicado.
- Vuelve a enviar el sitemap en Google Search Console después de cualquier limpieza masiva.
¿Prefieres que alguien más haga esta auditoría por ti? En Teraweb hacemos auditorías técnicas completas de sitemap, indexabilidad y arquitectura para sitios de cualquier tamaño. Escríbenos aquí y revisamos juntos el estado real de tu sitio.
Preguntas frecuentes
¿Necesito saber programar para usar estos scripts?
No es imprescindible. Ambos scripts están listos para copiar, pegar y solo cambiar la URL de tu sitio. Con PowerShell no necesitas instalar nada en Windows; con Python solo necesitas instalar una librería con un comando.
¿Funciona con cualquier CMS, no solo WordPress?
Sí. Mientras el sitio siga el estándar de sitemaps.org (la mayoría de CMS lo hacen), estos scripts funcionan igual sin importar si el sitio corre en WordPress, Shopify, Wix u otra plataforma.
¿Qué hago si mi sitemap no tiene un archivo índice, solo un sitemap.xml simple?
Ambos scripts se pueden adaptar fácilmente: en vez de recorrer una lista de sub-sitemaps, apuntas directamente al único archivo y extraes sus URLs de la misma forma.




