En SEO, entender qué entidades están presentes en un contenido es clave para mejorar la relevancia semántica, optimizar el enlazado interno y descubrir nuevas oportunidades de contenido.
En este artículo te voy a enseñar un script en Python que analiza varias URLs, extrae el texto de cada una, identifica sus entidades y te devuelve las 40 más repetidas, filtrando números y ruido.
¿Qué hace este script?
- Lee un listado de URLs (pegadas en consola, separadas por espacios o comas).
- Descarga el contenido HTML de cada URL con
requests. - Limpia el HTML (quitando
<script>,<style>, etc.) usandoBeautifulSoup. - Envía el texto a la API de TextRazor para extraer entidades.
- Filtra números y repeticiones para quedarte con entidades útiles.
- Cuenta las apariciones de cada entidad y devuelve las 40 más frecuentes en formato de texto separado por comas.
El código
# pip install textrazor requests beautifulsoup4
import re
import sys
from collections import Counter
from urllib.parse import urlparse
import requests
from bs4 import BeautifulSoup
import textrazor
# Clave API de TextRazor
textrazor.api_key = «AQUI_TU_API_KEY»
# Expresión regular para filtrar entidades con letras (evitar números)
ALPHA_RE = re.compile(r»[A-Za-zÁÉÍÓÚÜÑáéíóúüñ]»)
def fetch_text(url, timeout=20):
«»»Descarga y limpia el texto de una URL.»»»
headers = {«User-Agent»: «Mozilla/5.0 (compatible; EntityCollector/1.0)»}
r = requests.get(url, headers=headers, timeout=timeout)
r.raise_for_status()
soup = BeautifulSoup(r.text, «html.parser»)
for tag in soup([«script», «style», «noscript», «template»]):
tag.decompose()
return soup.get_text(» «, strip=True)[:100_000] # límite para API
def extract_entities_from_text(text, language=»spa»):
«»»Extrae entidades de un texto usando TextRazor.»»»
client = textrazor.TextRazor(extractors=[«entities»])
client.set_language_override(language)
resp = client.analyze(text)
names = []
for ent in resp.entities() or []:
name = (ent.matched_text or «»).strip()
if not name or not ALPHA_RE.search(name):
continue
occurrences = len(getattr(ent, «starting_positions», []) or [1])
names.extend([name] * occurrences)
return names
def main():
raw = input(«Pega las URLs separadas por comas o espacios: «).strip()
parts = re.split(r»[,\s]+», raw)
urls = [u if «://» in u else «https://» + u for u in parts if u]
counts = Counter()
first_seen_case = {}
for url in urls:
try:
text = fetch_text(url)
for e in extract_entities_from_text(text):
k = e.lower()
if k not in first_seen_case:
first_seen_case[k] = e
counts[k] += 1
except Exception as e:
print(f»[AVISO] {url}: {e}», file=sys.stderr)
top = [first_seen_case[k] for k, _ in counts.most_common(40)]
print(«, «.join(top))
if __name__ == «__main__»:
main()
Requisitos previos
- Python 3.9+ instalado
- Instalar dependencias:
pip install textrazor requests beautifulsoup4 - Registrarte en TextRazor y obtener una API Key.
Posibles usos para SEO
Este script no es solo un experimento técnico: puede ser una herramienta estratégica en cualquier auditoría o investigación SEO.
- Análisis de la competencia
- Pega varias URLs de competidores y obtén de forma inmediata las entidades que más repiten.
- Esto te muestra de qué hablan realmente, más allá de keywords exactas, y qué temas Google podría estar asociando con ellos.
- Optimización semántica de contenidos
- Introduce tus propias URLs y verifica si las entidades relevantes para tu sector aparecen con suficiente frecuencia.
- Si faltan, puedes integrarlas de forma natural para reforzar la temática y la relevancia.
- Detección de brechas de contenido (Content Gap)
- Compara las entidades más repetidas en contenidos de competidores con las tuyas.
- Aquellas que ellos trabajan y tú no, son oportunidades claras para nuevos artículos o actualizaciones.
- Planificación de clústers temáticos
- A partir de las entidades comunes en un grupo de artículos, puedes definir subtemas y crear un clúster de contenidos interconectados.
- Esto mejora la cobertura temática y la autoridad sobre un tema.
- Optimización del enlazado interno
- Usa las entidades más recurrentes como nodos clave (hubs) de tu arquitectura interna.
- Por ejemplo, si “inteligencia artificial” es frecuente, crea o refuerza una página pilar y enlaza desde todos los artículos que mencionan esa entidad.
- Monitoreo de cambios en la estrategia de un competidor
- Ejecuta el script cada cierto tiempo sobre las mismas URLs o categorías.
- Si empiezan a aparecer nuevas entidades relevantes, puede ser señal de un cambio en su enfoque o estrategia de contenidos.
Ejemplo de uso
Si analizamos 5 artículos de un competidor sobre IA y marketing, el script podría devolver:Inteligencia artificial, Google, SEO, aprendizaje automático, búsqueda, ChatGPT, algoritmos, datos, contenido...
Con esa lista sabrías de un vistazo qué conceptos dominan en su contenido y podrías compararlos con el tuyo.