Ir al contenido

Cómo utilizar selectores XPath para web scraping en Python

Si está buscando extraer datos de páginas web usando Python, XPath es una herramienta esencial que debe tener en su kit de herramientas de web scraping. XPath proporciona una manera de navegar a través de la estructura HTML de una página e identificar los elementos y datos exactos que necesita.

En esta guía, analizaremos los conceptos básicos de XPath y demostraremos cómo puede aprovechar su poder para el web scraping con Python. Al final, estará listo para abordar una amplia variedad de tareas de raspado utilizando XPath para extraer quirúrgicamente los datos que busca.

¿Qué es XPath?

XPath significa lenguaje de ruta XML. Es un lenguaje de consulta para seleccionar nodos de un documento XML o HTML. Con XPath, usted especifica un patrón para que coincida con la estructura del documento y devolverá todos los elementos que coincidan con ese patrón.

Aunque originalmente fue diseñado para XML, XPath funciona igual de bien con HTML, lo que lo hace ideal para fines de web scraping. Proporciona una alternativa más potente y flexible a los selectores CSS o las expresiones regulares.

Conceptos básicos de la sintaxis XPath

Para comenzar a utilizar XPath, necesitará comprender los componentes básicos de la sintaxis de XPath. Aquí están los conceptos clave:

Seleccionar nodos por nombre de etiqueta

La expresión XPath más básica consiste simplemente en especificar un nombre de etiqueta. Por ejemplo:

  • //h1 selecciona todos los <h1> elementos de encabezado en la página
  • //p selecciona todos los <p> elementos de párrafo
  • //img selecciona todos los <img> elementos de imagen

Seleccionar nodos por atributo

Puede seleccionar elementos que tengan un atributo o valor de atributo específico usando @ sintaxis:

  • //*[@class="highlighted"] selecciona todos los elementos que tienen la clase "resaltada"
  • //a[@href] selecciona todo <a> elementos de anclaje que tienen un atributo href
  • //img[@alt="Logo"] selecciona <img> elementos con un texto alternativo de "Logotipo"

Seleccionar nodos por posición

Puede seleccionar nodos según su posición usando corchetes [] y un índice numérico:

  • //ul/li[1] selecciona el primero <li> elemento dentro de cada <ul> lista desordenada
  • //table/tr[last()] selecciona el último <tr> fila en cada <table>
  • //ol/li[position() <= 3] selecciona los tres primeros <li> elementos en cada <ol> lista ordenada

Seleccionar nodos por relación

XPath le permite navegar hacia arriba y hacia abajo en el árbol del documento para seleccionar elementos en función de sus antepasados, descendientes, hermanos, etc.

  • //div[@class="content"]/* selecciona todos los elementos secundarios de <div> elementos con clase "contenido"
  • //p/.. selecciona los elementos padres de todos <p> párrafos
  • //h1/following-sibling::p selecciona todo <p> elementos que son hermanos después de un <h1> Bóveda
  • //section//img selecciona todo <img> elementos que son descendientes de un <section> a cualquier nivel

Predicados y funciones

XPath admite una amplia gama de predicados y funciones para refinar aún más sus selecciones:

  • //p[contains(text(),"scrapy")] selecciona <p> elementos que contienen el texto "scrapy"
  • //a[starts-with(@href,"https")] selecciona <a> elementos donde el href comienza con "https"
  • //ul[count(li) > 10] selecciona <ul> elementos que contienen más de 10 <li> artículos
  • //img[string-length(@alt) > 0] selecciona <img> elementos con un atributo alt no vacío

Usando XPath con lxml y BeautifulSoup

Ahora que comprende los conceptos básicos de la sintaxis XPath, veamos cómo puede usarla en Python con las populares bibliotecas lxml y BeautifulSoup. Veremos un ejemplo de cómo extraer el texto del encabezado principal de la página de inicio de ScrapingBee.

Analizando HTML con lxml y BeautifulSoup

Primero, necesitamos recuperar el HTML de la página web usando la biblioteca de solicitudes y analizarlo en una estructura de árbol que podamos consultar con XPath. Usaremos BeautifulSoup para analizar HTML y lxml para evaluar nuestras expresiones XPath:

import requests
from bs4 import BeautifulSoup
from lxml import etree

html = requests.get("https://scrapingbee.com") 
soup = BeautifulSoup(html.text, "html.parser")
dom = etree.HTML(str(soup))

Aquí nosotros:

  1. Obtener el HTML usando requests.get()
  2. Analiza la cadena HTML en un objeto BeautifulSoup usando html.parser
  3. Convierta el objeto BeautifulSoup en una cadena para que podamos analizarlo con lxml. etree.HTML() función
  4. Analizar la cadena en un lxml Element objeto que podemos consultar usando XPath

Construcción y evaluación de expresiones XPath

Ahora que tenemos un árbol HTML analizado, podemos construir una expresión XPath para seleccionar el archivo principal. <h1> título en la página:

heading_xpath = ‘//h1‘

Para evaluar este XPath con nuestro documento HTML analizado, utilizamos el xpath() método:

heading_elements = dom.xpath(heading_xpath)

El dom.xpath() call devolverá una lista de todos los elementos que coinciden con nuestro selector XPath. En este caso, sólo debería haber una coincidencia. <h1> .

Extracción de texto y atributos

Una vez que tenemos una referencia al elemento, podemos extraer fácilmente su texto y cualquier atributo usando las propiedades de lxml:

heading_text = heading_elements[0].text
print(heading_text)
# Tired of getting blocked while scraping the web?  

¡Hemos extraído con éxito el texto del encabezado con una sola línea de XPath! También podríamos acceder a los valores de los atributos del elemento usando get():

heading_id = heading_elements[0].get(‘id‘)  

Usando XPath con Selenio

Un enfoque alternativo es utilizar Selenium para automatizar y eliminar sitios web dinámicos que requieren JavaScript. Selenium proporciona sus propios métodos para seleccionar elementos utilizando cadenas XPath.

Configurar Selenium WebDriver

Para comenzar con Selenium, primero debe instalar el paquete Selenium y un controlador web para el navegador que desea utilizar. Así es como puede configurar un controlador de Chrome:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver_path = "/path/to/chromedriver"  
driver = webdriver.Chrome(driver_path)

Asegúrese de descargar la versión de ChromeDriver adecuada para su instalación de Chrome y proporcione la ruta al ejecutable.

Encontrar elementos con XPath

Con el controlador configurado, podemos navegar a una página web y comenzar a buscar elementos. WebDriver de Selenium proporciona una find_element método que acepta un localizador XPath:

driver.get("https://scrapingbee.com")

heading_xpath = "//h1"
heading_element = driver.find_element(By.XPATH, heading_xpath)

Similar al ejemplo lxml, esto encontrará el primer <h1> elemento en la página. Si desea encontrar todos los elementos que coincidan con un XPath, utilice find_elements en lugar:

paragraph_xpath = "//p"
paragraph_elements = driver.find_elements(By.XPATH, paragraph_xpath)  

Extracción de texto y atributos

Una vez que tenga una referencia a un elemento web, puede acceder a sus propiedades como contenido de texto y atributos:

heading_text = heading_element.text
print(heading_text)  
# Tired of getting blocked while scraping the web?

paragraph_id = paragraph_elements[0].get_attribute("id")

Extraer datos con Selenium y XPath es bastante sencillo, pero tenga en cuenta que Selenium es generalmente más lento que usar una biblioteca de solicitudes HTTP simple, ya que ejecuta un navegador real.

Sugerencias y mejores prácticas

Cuando empieces a utilizar XPath para el web scraping, aquí tienes algunos consejos y trucos que debes tener en cuenta:

Utilice Chrome DevTools para probar expresiones XPath

Al construir selectores XPath, es muy útil probarlos interactivamente para asegurarse de que coincidan con lo esperado. Chrome DevTools proporciona una manera sencilla de hacer esto:

  1. Haga clic derecho en un elemento y seleccione "Inspeccionar" para abrir el panel Elementos de DevTools
  2. Presione Ctrl+F para abrir el cuadro de búsqueda.
  3. Ingrese su expresión XPath para resaltar los elementos coincidentes en la página

Manejar el marcado inconsistente

Los sitios web en la naturaleza a menudo tienen un marcado HTML inconsistente o roto que puede hacer tropezar sus selectores XPath. Es una buena idea utilizar una biblioteca como BeautifulSoup para limpiar y normalizar el HTML antes de analizarlo con lxml.

Escriba XPath robusto y mantenible

Para minimizar las posibilidades de que su raspador se rompa debido a cambios de diseño en el sitio de destino, intente escribir expresiones XPath que sean lo más específicas posible pero no más específicas de lo necesario. Favorezca la selección por propiedades semánticas como nombres de etiquetas, ID y atributos de datos en lugar de confiar en la estructura específica del marcado.

También es una buena idea dividir expresiones XPath complejas en variables con nombres descriptivos para mejorar la legibilidad y el mantenimiento.

Resultados de caché para mejorar el rendimiento

Si está recopilando grandes cantidades de datos o accediendo a las mismas páginas varias veces, considere almacenar en caché los resultados HTML y XPath analizados para evitar solicitudes de red innecesarias y gastos generales de análisis. Puede utilizar un diccionario simple o una solución más sólida como MongoDB o Redis para el almacenamiento en caché.

Conclusión

XPath es una herramienta increíblemente poderosa para extraer datos con precisión de páginas HTML. Con un conocimiento básico de la sintaxis y la capacidad de traducir selectores CSS a sus equivalentes XPath, puede manejar una amplia variedad de tareas de web scraping.

Las bibliotecas de Python como lxml, BeautifulSoup y Selenium brindan formas sencillas de integrar XPath en sus flujos de trabajo de scraping. Dependiendo de sus necesidades específicas y de las características del sitio de destino, puede elegir el enfoque que funcione mejor.

A medida que continúa su viaje de web scraping con Python y XPath, asegúrese siempre de respetar los términos de servicio del sitio web y las restricciones de robots.txt. Y recuerde repasar los fundamentos de las funciones y operadores XPath: ¡se sorprenderá de lo mucho que puede lograr con solo unas pocas líneas de XPath inteligente!

Únase a la conversación

Su dirección de correo electrónico no será publicada. Las areas obligatorias están marcadas como requeridas *