Web Scraping con XPath

David Castro
2 min readApr 28, 2021

--

Photo by Domenico Loia on Unsplash

¿Qué es XPath?

XPath (XML Path Language) es un lenguaje que permite construir expresiones que recorren y procesan un documento XML. La idea es parecida a las expresiones regulares para seleccionar partes de un texto sin atributos (plain text). XPath permite buscar y seleccionar teniendo en cuenta la estructura jerárquica del XML. Más información: https://es.wikipedia.org/wiki/XPath

Componentes

/

Al usarse al principio de la cadena de Xpath hace referencia al comienzo del documento. Por ejemplo, para extraer los compones head y body:

head = '/html/head'
body = '/html/body'

Representa cualquier hijo a partir del punto en el que se encuentra la ruta. Por ejemplo, para consultar los nombres de todos los elementos hijos del body:

elements_body = '/html/body/*'

.

EL punto sirve para indicar que el camino sigue desde la posición actual. Por ejemplo, para obtener los nietos de tipo <div> del elemento body, se puede escribir:

divs = './*/div'

//

Se pueden usar para saltar niveles. Por ejemplo, si quisiéramos ver cuantos <div> están contenidos dentro de body en cualquier nivel:

divs = '/html/body//div'

@

Selecciona atributos. Por ejemplo:

attribute = '//div[@class="name_class"]'

text()

Devuelve el valor en texto de un nodo. Por ejemplo:

text = '//div[@class="name_class"]/p/text()'

🕹️ Jugando con XPath en el navegador

Una manera de “jugar” o probar las cadenas que armamos con Xpath es hacerlo directamente en el navegador con Javascript. Para realizar este proceso, abrimos la consola del navegador, haciendo clic derecho sobre la ventana del navegador y después dando clic en inspeccionar o presionando la tecla F12 del teclado estando en el navegador, y allí vamos a la opción de Console. Allí podemos ejecutar lo siguiente:

$x('cadena_xpath')// Ejemplo básico
$x('/html')

Predicados con XPath

  • /html/body/div/div[1]: Trae el primer div de la lista. Devuelve el nodo con el índice indicado.
  • /html/body/div/div[last()]: Trae el ultimo
  • //span[@class=”text”]: Todos los span que traiga los atributos de tipo class

Wildcards en Xpath

  • *: Devuelve cualquier nodo
  • @*: Devuelve cualquier atributo
  • node(): Devuelve cualquier nodo y más detalles

Ejemplos:

  • /html/*: Todos los nodos después de la etiqueta HTML
  • //*: Trae todo los nodos y todos los atributos de esos nodos

Web Scraping con Xpath

import requests
import lxml.html as html
HOME_URL = '<https://www.larepublica.co/>'XPATH_LINK_TO_ARTICLE = '//text-fill[not(@class)]/a/@href'try:
response = requests.get(HOME_URL)

if response.status_code == 200:
home = response.content.decode('utf-8')
parsed = html.fromstring(home)
links_to_notices = parsed.xpath(XPATH_LINK_TO_ARTICLE)
print("Cantidad de Links: ", len(links_to_notices))
# Imprimir todos los links de noticias
print(links_to_notices)

else:
raise ValueError(f"Error: {response.status_code}")
except ValueError as ve:
print(ve)

🚀 Repositorio

Referencias

--

--

David Castro
David Castro

Written by David Castro

🚀 Software Engineer with a master’s in Software Development, working as a 🖥️ Backend Developer using 🐍 Python.

No responses yet