XPath para SEO Cheat Sheet y guía de uso

¿Buscas esa expresión Xpath para extraer de webs el contenido de etiquetas HTML o algún dato concreto y se te resiste dar con la expresión que te permita hacerlo? Pues aquí vas a encontrar todo eso y mucho más. 

No sólo voy a listar las expresiones Xpath más frecuentes si no que voy a darte otras que te resultarán de utilidad y pautas para que te cueste menos dar con alguna específica que necesites.

Qué son las expresiones Xpath y por qué este post

Las expresiones XPath -del inglés XML Path Language- sirven para identificar y extraer partes concretas de un contenido XML como pueda ser el etiquetado HTML de las páginas. Se basan en la jerarquía del HTML por nodos de modo que indicando la ruta concreta de un elemento podríamos sacar su contenido o atributos de éste.  

El  motivo por el que me he lanzado a hacer este post es doble, por un lado hay veces que uso expresiones Xpath "complejas" de forma repetitiva y me gustaría tener un sitio dónde las vaya recopilando todas para copiar y pegar y poder así ir mucho más rápido que teniendo que construirlas cada vez.

El segundo motivo es que comparto con frecuencia en Twitter, mi canal de Youtube o el de Webpositer contenido relacionado con escrapeo a través de Xpath y para el que no tengo tampoco recopiladas las expresiones que enseño, sobre todo en el caso de Twitter que van en Tweets aislados sin seguir un hilo ¡mea culpa, lo sé!

Esta es toda la "chapa" sobre XPath, vamos ya al grano.

Expresiones XPath con etiquetas HTML más habituales y parametrizadas

Expresión XPath ¿Qué nos devuelve?
//title Contenido de la etiqueta title
//meta[@name='description']/@content Contenido de la meta-etiqueta description
//h1 Contenido de todas las etiquetas H1 que haya en la URL
//h1/text()[1]

Contenido de la primera etiqueta H1 que se encuentre

count(//h1) Nº de etiquetas H1 en la página
//link[@rel='canonical']/@href Valor de la etiqueta rel canonical
//meta[@name='robots']/@content Valor de la etiqueta meta-robots
//a/@href[contains(.,'texto')] URL de un enlace que contengan en el valor de href el texto indicado, por ejemplo un dominio
//a[contains(@href, 'texto')] Anchor text usado en un enlace que contenga el texto indicado en el atributo href
//a[contains(@href, 'URL')]/@rel Valor de la etiqueta rel de un enlace (si existe) cuya URL coincida con la indicada
//a[contains(@rel, 'nofollow')]/@href Relación de URLs de enlaces cuya etiqueta rel contiene nofollow
//a[@style='display:none;']/@href Relación de enlaces ocultos con display:none;
//a[@href='https://www.dominio.es/blog']/attribute::* Relación de atributos que tiene ese enlace
//link/@hreflang Valores ISO de todos los hreflang definidos
//link[@hreflang]/@href Valores (URLS) de los href que figuran en cada hreflang definido
//img[not(@alt)]/@src Relación de imágenes sin texto en el atributo ALT
//*[@class="breadcrumb"]/span/span/a Todos los anchor texts de migas de pan para unas breadcrumbs que tienen el class "breadcrumb" (Ejemplo)
//meta[@name="viewport"]/@content Nos devuelve el contenido del viewport

 

Esta ultima expresión relacionada con la extracción de elementos (anchor texts) de los distintos niveles de unas migas de pan es un ejemplo muy concreto sacado de un Wordpress cuyas migas de pan tenían el class "breadcrumb" pero no es válido para cualquier Wordpress ni para cualquier breadcrumbs. Extraer estos datos a veces puede ser bastante pesado sobre todo si al buscar la expresión XPath nos aparecen IDs de capas, el wrapper o incluso de posts. Para enteder la metodología mediante la que conseguir el XPath definitivo para tu análisis te comiendo que veas este vídeo de Xpath de mi canal y si te gusta... pues suscríbete. :)

XPath para escrapero de SERPs

Expresión XPath ¿Qué nos devuelve?
//*[@id="rso"]/div/div/div[1]/a/@href Relación de URLs del listado de la página de resultados
//*[@id="rso"]/div/div/div[1]/a/h3 Relación de titles de los snippets en el listado de la página de resultados
//*[@class='card-section']/div/p/a Lista de búsquedas relacionadas que se muestra hacia el final de página de resultados
//*[@class='related-question-pair']/g-accordion-expander/div/div Relación de preguntas+respuestas del bloque "Otras preguntas de los usuarios"
//div[contains(@data-sokoban-container,'i')]/div[1]/div/a/@href

Relación de URLs del listado de la página de resultados - Actualizado a 25/11/2022

 

Estas 4 expresiones XPath son válidas en este momento pero Google suele cambiar con frecuencia la estructura de SERPs por lo que es probable que transcurrido cierto tiempo necesiten algún tipo de cambio o incluso sean totalmente diferentes.

XPath para escrapeo de Datos Estructurados, Twitter Cards y Open Graph

Expresión XPath ¿Qué nos devuelve?
//*[@itemtype]/@itemtype Relación de todos los marcados de datos incluidos en la URL escrapeada
//meta[@property='article:published_time']/@content Fechas de los posts, útil cuando el atributo fecha no se está visualizando en el post

 

En esta última tabla podría incluir muchísimos más pero os dejo los únicos 2 que uso con cierta frecuencia, sobre todo el de las fechas.

Guía de uso de XPath

Para escrapear usando XPath solo necesitas 2 cosas, la expresión a escrapear y una herramienta de scraping como pueda ser la extensión Scraper para Google Chrome, Screaming Frog SEO Spider o el propio Google Sheets con su función IMPORTXML.

En el vídeo que mencionaba más arriba explico cómo obtener XPaths específicos pero te lo adelanto aquí también. En Chrome basta con que abras el inspector con F12 o con Botón derecho+Inspeccionar y sobre la línea de código de la que quieras obtener el XPath haces Click derecho > Copy > Copy Xpath. 

Normalmente esa expresión XPath te valdrá para sacar un único elemento y en la mayoría de los casos querrás obtener listados o más valores por lo que te tocará hacer algunos ajustes sobre la expresión para poder aplicarlos después en alguna de esas herramientas. Te recomiendo que veas ese vídeo en el que pongo ejemplos de todo esto y enseño el método para que puedas dar con la expresión que necesitas.

En el vídeo incluyo solo ejemplos con Scraper y con IMPORTXML pero en este otro vídeo del canal de Webpositer pongo ejemplos de escrapeo con Screaming Frog.

Bonus XPath

  • En este hilo de Twitter explico como usar XPath y la extensión de Chrome Scraper para obtener una relación de enlaces que no cumplen el patrón de terminación con o sin "/" final y para los que no se incluye anchor text o ALT, están en blanco.
  • La extensión Scraper permite almacenar Presets de XPath para ir más rápido en tareas repetitivas, por ejemplo podemos guardar uno para para hacer scraping en formato tabla y pegar directamente en exel. 
  • La herramienta Ahrefs tiene una versión gratuita de su análisis de backlinks que no cuenta con opción de exportar y que NO podemos escrapear con Google Sheets u otras herramientas ya que los resultados se generan dinámicamente, pero con la que sí podemos usar la extensión de Chrome Scraper. La herramienta la tenéis aquí https://ahrefs.com/es/backlink-checker y estos son 2 presets que podéis usar para rapado de datos en modo tabla : /tbody/tr[td] o //tbody/tr/td/div[a] y //tbody/tr/td/div[p]
  • Cheat Sheet de XPath :  En este enlace encontraréis el listado de este blog en formato sheets para que podáis copiarlo.
  • Masterclass XPath aplicado a SEO para ecommerce : Si quieres profundizar más sobre el uso de XPath en tu día a día como SEO y conocer incidencias y técnicas para ahorrar tiempo en la extracción de datos te recomiendo esta clase que hice para Quondos, además en esta comunidad de profesionales SEO encontrarás mucha más formación de alto nivel de otros consultores reconocidos a nivel nacional e internacional.

Preset de XPath en la extensión Scraper

Ejemplo de Preset de XPath con Scraper para obtener el listado de Backlinks con la herramienta gratuita de Ahrefs.

Ale pues hasta aquí el post sobre expresiones XPath para SEO, al menos de momento, las nuevas que vaya localizando y usando con frecuencia las iré incluyendo en actualizaciones de este artículo.

Como siempre espero que os sea de utilidad y si tenéis alguna duda o propuesta dejádmela en los comentarios.

¡¡Aaaaaaadios!!