Volver al blog
Casos de uso
Mihai MaximLast updated on Mar 31, 20268 min read

Selectores XPath frente a selectores CSS

Selectores XPath frente a selectores CSS

XPath frente a CSS

Como aficionado al web scraping, probablemente te hayas topado con los términos «selectores XPath» y «selectores CSS». Se trata de dos métodos muy utilizados para navegar y extraer elementos de un documento HTML o XML, pero ¿qué son exactamente y en qué se diferencian? En este artículo, te guiaré a través de una comparación detallada entre los selectores XPath y CSS, analizando sus características y casos de uso.


Comenzaremos con una breve introducción a los selectores XPath y CSS, y utilizaremos ejemplos para mostrar cómo se pueden emplear para navegar y extraer elementos de un documento HTML. Exploraremos las diferencias en sintaxis y capacidades, y analizaremos las diversas funciones integradas que ofrece XPath, así como la forma de lograr los mismos resultados utilizando CSS y JavaScript. También discutiremos las ventajas y desventajas de cada método y cómo decidir cuál utilizar para tu proyecto.

Así que, coge un cuaderno, afila el lápiz y prepárate para sumergirte en el mundo de los selectores XPath y CSS.

Descripción general de los selectores

XPath, abreviatura de XML Path Language, es un lenguaje de consulta que se utiliza para navegar por un documento XML. Se introdujo por primera vez en 1999 como una forma de proporcionar un método estándar para acceder a elementos dentro de un documento XML. El lenguaje se basa en el concepto de «ruta», que se utiliza para seleccionar elementos específicos en función de su posición dentro del documento.

Una de las características clave de XPath es el uso de la notación de ruta. Esta notación te permite seleccionar elementos en función de su ubicación en el árbol del documento. Por ejemplo, en un documento HTML, la ruta «html/body/p» seleccionaría todos los elementos p que son hijos directos del elemento body, el cual, a su vez, es un hijo directo del elemento html.

La sintaxis de XPath es bastante sencilla:

//tagname[@attribute='value']

Donde «tagname» es el tipo de elemento HTML que se busca (p. ej., div, a, p), «attribute» es una propiedad del elemento HTML deseado mediante la cual nuestro localizador realiza la búsqueda (p. ej., class) y «value» es el valor específico que se desea encontrar

Los selectores CSS, abreviatura de Cascading Style Sheets (hojas de estilo en cascada), se utilizan para seleccionar elementos en función de sus propiedades, como class, id y atributos. Son más fáciles de leer y comprender que XPath, pero tienen una capacidad limitada para navegar por el documento. Los selectores CSS se utilizan principalmente para el estilo y el diseño, pero también se pueden usar para extraer información de una página web:

<html> <body> <p class="highlight">Hello, world!</p> </body> </html>

|

Para seleccionar el texto «¡Hola, mundo!» utilizando selectores CSS, tendremos que usar JavaScript:

let p_tag = document.querySelector(“p.highlight”)

let p_text = p_tag.innerText

XPath, por otro lado, fue diseñado específicamente para proporcionar un lenguaje de consulta para documentos XML y cuenta con una amplia gama de funciones integradas. Estas funciones se pueden utilizar para realizar cálculos y extraer información específica de los elementos. Por ejemplo, con la función text() de XPath, puedes seleccionar directamente el valor de texto de un elemento:

<html> <body> <p>Hello, world!</p> </body> </html>

Para seleccionar el texto «Hello, world!» utilizando la función text() en XPath, la expresión sería:

/html/body/p/text()

Recursos adicionales

Si quieres profundizar en el mundo de los selectores XPath y CSS, tenemos un par de artículos que pueden ayudarte. Este primer artículo cubre los conceptos básicos de los selectores XPath, incluyendo la sintaxis, las funciones y cómo navegar por el árbol DOM. Este segundo artículo profundiza en los conceptos básicos de los selectores CSS, incluyendo los diferentes tipos de selectores.

Configuración de un ejemplo

Para ilustrar claramente las principales diferencias entre los selectores XPath y CSS, analicemos una estructura HTML ficticia:

<!doctype html>

<html>

    <head>

        <title>Top News</title>

        <meta charset="utf-8" />

    </head>

    <body>

        <h1>Top News Stories</h1>

        <div class="container">

            <div class="news-story">

                <h2> <a href="https://edition.cnn.com/2022/12/28/weather/buffalo-winter-storm-new-york-blizzard-wednesday/index.html">Winter Storm</a> </h2>

                <p>Winter storm death toll rises to 37 in Buffalo as criticism arises over handling of storm and cleanup</p>

            </div>

            <div class="news-story">

                <h2> <a href="https://www.nbcnews.com/politics/politics-news/spacex-leader-reassured-nasa-chief-elson-musk-rcna61189">SpaceX</a> </h2>

                <p>NASA chief: SpaceX leader says Elon Musk’s Twitter drama is ‘nothing to worry about’.</p>

            </div>

        </div>

    </body>

</html>

Probar los selectores en las herramientas de desarrollo

Probar los selectores XPath y CSS en las herramientas de desarrollo es una forma rápida y sencilla de verificar que tus selectores funcionan correctamente. El proceso es similar en la mayoría de los navegadores modernos, pero a efectos de este ejemplo, utilizaremos Google Chrome.

Para empezar, abre en Google Chrome la página web en la que quieras probar tus selectores. A continuación, haz clic con el botón derecho del ratón en un elemento que quieras seleccionar y elige «Inspeccionar» en el menú contextual. Esto abrirá la ventana de herramientas de desarrollo:

En la ventana de herramientas de desarrollo, verás el código fuente HTML de la página web en el lado izquierdo y la página web renderizada correspondiente en el lado derecho.

Para encontrar el XPath completo y el selector CSS de un elemento, haz clic con el botón derecho del ratón sobre el elemento en el HTML y selecciona «Copiar > Copiar XPath completo» o «Copiar > Copiar selector». Esto copiará la ruta completa al elemento, incluidos todos los elementos padres, a tu portapapeles. A continuación, puedes pegar esta ruta en tu código o en la barra de búsqueda de las herramientas de desarrollo (Ctrl+F) para acceder al elemento.

Por ejemplo, si quisieras seleccionar todas las etiquetas h2 del código HTML de ejemplo proporcionado anteriormente, escribirías «//h2» en la barra de búsqueda y pulsarías Intro.

Conclusiones principales

Una de las principales diferencias entre XPath y CSS es que XPath puede seleccionar elementos en función de su posición en el documento. Los selectores CSS se limitan a seleccionar elementos en función de sus propiedades.

Por ejemplo, en XPath, podemos seleccionar el segundo elemento div con la clase news-story utilizando la expresión //div[@class='news-story'][2]. Con los selectores CSS, solo podemos seleccionarlo utilizando div.news-story:nth-child(2).

div.news-story:nth-child(2) seleccionará el segundo elemento div entre todos los elementos div que tengan la clase «news-story» y sean hijos del mismo elemento contenedor.

//div[@class='news-story'][2] te permite seleccionar el elemento en función de su posición en todo el documento. El elemento no tiene por qué ser hijo de un elemento contenedor específico:

<html>

  <body>

    <div class="container">

      <div class="news-story">

        <h2>News Story 1</h2>

      </div>

    </div>

    <div class="container">

      <div class="news-story">

        <h2>News Story 2</h2>

      </div>

    </div>

  </body>

</html>

En este ejemplo concreto, div[@class='news-story'][2] selecciona la segunda noticia.

div.news-story:nth-child(2) no selecciona nada, ya que cada elemento contenedor tiene solo un hijo directo.

Mayor flexibilidad

XPath permite una mayor flexibilidad a la hora de navegar por el árbol DOM. Incluye la capacidad de desplazarse hacia arriba y hacia abajo por el árbol. Los selectores CSS solo permiten la navegación hacia abajo. Esto hace que XPath sea más potente y versátil, pero también más complejo.

Con XPath, puedes utilizar ejes como el de padres y el de antepasados para acceder al padre o al antepasado de un elemento, lo cual no es posible con los selectores CSS.

Por ejemplo, la expresión XPath //div[@class='news-story'][1]/parent::*//h2 selecciona el primer elemento div con la clase «news-story». A continuación, navega hasta su elemento padre utilizando el operador parent::*, y luego selecciona el elemento h2 dentro de ese elemento padre.

Como alternativa, puedes utilizar corchetes para seleccionar el elemento padre del primer elemento div con la clase «news-story» y, a continuación, seleccionar el elemento h2 dentro de ese elemento padre utilizando //div[@class='news-story'][1]/..//h2.

Funciones integradas

Otra diferencia importante entre los selectores XPath y CSS es que XPath cuenta con una amplia gama de funciones integradas, como count(), sum(), string(), substring() y contains(). Estas funciones se pueden utilizar para manipular elementos y extraer datos.

count() se puede utilizar para contar el número de elementos que cumplen determinados criterios. Por ejemplo, para contar el número de elementos div con la clase news-story, podemos utilizar la expresión XPath count(//div[@class='news-story']).

El equivalente en CSS y JavaScript sería:

document.querySelectorAll('div.news-story').length

sum() se puede utilizar para calcular la suma de un valor determinado para un conjunto de elementos que cumplen ciertos criterios. Por ejemplo, para calcular el número total de caracteres en el contenido de texto de todos los elementos p, podemos utilizar la expresión XPath sum(//p/text()/string-length()).

Las contrapartes en CSS y JavaScript serían:

var sum = 0;

var elements = document.querySelectorAll('p');

elements.forEach(function(element) {

  sum += element.innerText.length;

});

console.log(sum);

substring() se puede utilizar para extraer una subcadena de una cadena. Por ejemplo, para extraer el segundo al quinto carácter del contenido de texto de un elemento determinado, podemos utilizar la expresión XPath substring(//p/text(), 2, 5).

Las contrapartes en CSS y JavaScript:

document.querySelector('p').innerText.substring(2, 5)

contains() se puede utilizar para comprobar si una cadena contiene una determinada subcadena. Por ejemplo, para comprobar si el contenido de texto de un determinado elemento p contiene la palabra «Winter», podemos utilizar la expresión XPath //p[contains(text(),"Winter")]

Ventajas de los selectores CSS

Los selectores CSS tienen varias ventajas sobre XPath que los convierten en una excelente opción para determinados proyectos. Una de las principales ventajas de los selectores CSS es su simplicidad y legibilidad. A diferencia de XPath, que puede resultar complejo y difícil de leer, los selectores CSS son fáciles de entender y utilizar.

Otra ventaja de los selectores CSS es su rendimiento. Dado que los selectores CSS solo navegan hacia abajo en el árbol DOM, suelen ser más rápidos que XPath, que puede navegar tanto hacia arriba como hacia abajo en el árbol.

Por último, los selectores CSS también se utilizan más ampliamente en el desarrollo web. Esto significa que es más probable que los desarrolladores web estén familiarizados con ellos y puedan estar más dispuestos a ayudarte con tus proyectos.

Conclusión

En resumen, tanto XPath como los selectores CSS son herramientas potentes que te permiten navegar y extraer elementos de un documento HTML. XPath es potente y flexible, pero puede resultar difícil de leer, mientras que los selectores CSS son más fáciles de leer, pero tienen una capacidad limitada para navegar por el documento.

A la hora de elegir entre XPath y los selectores CSS, ten en cuenta la estructura del documento y la información que deseas extraer. Si buscas extraer datos basándote en la posición de los elementos, XPath es la mejor opción. Sin embargo, si buscas extraer datos basándote en propiedades como la clase o el identificador, los selectores CSS son una mejor opción.

Si te interesa saber más sobre cómo el web scraping puede ayudar a tu negocio, te invito a que te pongas en contacto con nosotros en WebScrapingAPI. ¡Estaremos encantados de responder a todas tus preguntas!

Acerca del autor
Mihai Maxim, Desarrollador Full Stack @ WebScrapingAPI
Mihai MaximDesarrollador Full Stack

Mihai Maxim es desarrollador full stack en WebScrapingAPI, donde colabora en todas las áreas del producto y ayuda a crear herramientas y funciones fiables para la plataforma.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.