Web Scraping con XPath
¿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 htmlHOME_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
- Documentación XPath https://www.w3.org/TR/xpath/
- XPath https://es.wikipedia.org/wiki/XPath