Introducción al análisis web en Python con Parsel

Python, Ene-03-20255 minutos de lectura

El web scraping se ha convertido en una habilidad esencial para los desarrolladores de Python, los científicos de datos y los entusiastas del web scraping. Ya se trate de extraer datos para su análisis, crear una herramienta de comparación de precios o automatizar la extracción de contenidos, el análisis sintáctico web es la base de cada una de estas tareas. Pero, ¿qué hace que el análisis sintáctico web sea eficiente y fácil de usar para principiantes? Parsel es unapotente biblioteca de Python que simplifica el análisis sintáctico de HTML y la extracción de datos.

Introducción a Parsel

¿Qué es el análisis sintáctico de páginas web y por qué es importante?

Parsel es una biblioteca ligera de Python diseñada para el análisis sintáctico de HTML/XML y la extracción de datos. Creada pensando en el web scraping, Parsel facilita la interacción con estructuras de páginas web mediante potentes selectores como XPath y CSS. Estas herramientas permiten localizar y extraer con precisión elementos o atributos específicos de páginas web. La integración de Parsel con el ecosistema de Python también significa que funciona a la perfección con bibliotecas como `requests` y `httpx` para obtener contenido web.

Características principales de Parsel

  • Compatibilidad con selectores: Utilice XPath para una navegación de rutas detallada o selectores CSS para una sintaxis más sencilla.
  • Flexibilidad: Admite múltiples tareas de análisis sintáctico HTML/XML, desde la simple extracción de texto hasta el manejo de elementos anidados en profundidad.
  • Escalabilidad: Parsel puede extraer datos de una o varias páginas mediante estructuras en bucle.
  • Integración con Scrapy: La compatibilidad de Parsel se extiende naturalmente a Scrapy, un popular framework de web scraping.

Casos de uso común

  • Web Scraping: Extracción de datos de sitios web de comercio electrónico para el seguimiento de precios.
  • Extracción de datos: Recopilación de información de contacto o datos de investigación a partir de registros públicos.
  • Automatización: Racionalización de tareas repetitivas como la descarga de especificaciones de productos.

Comprender los selectores y el análisis de HTML

¿Qué es el análisis sintáctico de HTML?

El análisis sintáctico de HTML es el proceso de descomponer un documento HTML en sus componentes estructurales, como etiquetas, atributos y el Modelo de Objetos del Documento (DOM). Parsel utiliza esta estructura para localizar y extraer con precisión los datos que necesita.

Los documentos HTML se construyen utilizando:

  • Etiquetas: Definir el tipo de elemento (por ejemplo, <h1>, <p>, <img>).
  • Atributos: Proporcionar información adicional sobre un elemento (p. ej, id, clase, href).
  • DOM: Representación jerárquica de la página web, que permite la navegación entre elementos.

¿Qué son los selectores?

Los selectores XPath y CSS son lenguajes de consulta utilizados para seleccionar elementos en un documento HTML:

  • XPath: Potente y rico en funciones, XPath le permite seleccionar nodos basándose en su ruta en el DOM, relaciones padre-hijo y condiciones.
  • Selectores CSS: Una sintaxis más simple utilizada a menudo en el desarrollo front-end, ideal para seleccionar elementos basados en clases, IDs o pseudo-selectores.

Más información sobre los selectores aquí.

Requisitos previos

Antes de empezar con Parsel, asegúrate de lo siguiente:

  • Python instalado: Descargue e instale Python desde
  • Instale las bibliotecas necesarias(parsel, requests): 
pip install parsel peticiones

Técnicas de análisis sintáctico de HTML

Extracción de elementos por ID y clase

Parsel nos permite analizar un elemento simplemente conociendo su nombre de clase o ID. Esto resulta especialmente útil para extraer datos de elementos concretos de una página web.

Para demostrarlo, utilizaremos ejemplo de sitio web. Nos centraremos en la extracción de datos de un elemento con el nombre de clase producto_podque representa una única entrada de libro.

A continuación se muestra un ejemplo de su estructura HTML:

De este elemento extraeremos:

  • Título del libro
  • Precio del libro
  • Estado de disponibilidad

Ejemplo de código Python

importar peticiones
from parsel import Selector

# Obtener la página web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(respuesta.texto)

# Seleccionar el primer producto por clase
producto = selector.css("articulo.producto_pod").get()

# Parsear detalles del producto seleccionado
product_selector = Selector(text=producto)
title = product_selector.css("h3 a::attr(title)").get()
precio = product_selector.css("p.precio_color::text").get()
disponibilidad = product_selector.css("p.instock.availability::text").get().strip()

print("Título:", título)
print("Precio:", precio)
print("Disponibilidad:", disponibilidad)

Explicación del guión:

  • Obtener la página web: El script envía un GET al sitio web de ejemplo para recuperar su contenido HTML.
  • Seleccione el bloque de productos: Utiliza el selector CSS articulo.producto_pod para seleccionar la primera entrada de libro de la página.
  • Analiza los detalles del producto: El script extrae el título, precioy disponibilidad dirigiéndose a etiquetas y atributos HTML específicos dentro del producto_pod bloque.
  • Mostrar los resultados: Los datos extraídos se imprimen en la consola en un formato legible.

Ejemplo de salida

Título: Una luz en el desván
Precio: 51,77
Disponibilidad: En stock

Extraer texto de los elementos

Parsel facilita la extracción de texto de elementos HTML, ya sea un título, una descripción u otro contenido visible en una página web.

Para demostrarlo, utilizaremos el mismo ejemplo de sitio web de nuevo. Nos centraremos en extraer el texto del título de un solo libro utilizando la función h3 anidada dentro de un elemento article con la clase producto_pod.

A continuación se muestra un ejemplo de su estructura HTML:

De este elemento extraeremos:

  • El texto del título del libro

Ejemplo de código Python

importar peticiones
from parsel import Selector

# Obtener la página web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(respuesta.texto)

# Seleccionar el primer producto por clase
producto = selector.css("articulo.producto_pod").get()

# Parsear el texto del título del producto seleccionado
product_selector = Selector(text=producto)

title_text = product_selector.css("h3 a::attr(title)").get()
print("Texto del título:", texto_del_título)

Explicación del guión:

  • Obtener la página web: El script envía un GET para recuperar el contenido HTML del sitio web.
  • Seleccione el bloque de productos: El artículo.producto_pod El selector CSS se dirige a la primera entrada del libro.
  • Extraer el texto del título: Utilizando h3 a::attr(title)el script extrae el atributo title del archivo <a> anidada en la etiqueta <h3> etiqueta.
  • Mostrar el resultado: El título extraído se imprime en la consola.

Ejemplo de salida

Texto del título: Una luz en el ático

Extracción de atributos (por ejemplo, `href`, `src`, `alt`)

Parsel también nos permite extraer valores de atributos, como href, src o alt, de elementos HTML. Estos atributos suelen contener datos valiosos como URL, fuentes de imágenes o texto descriptivo.

Nos centraremos en extraer el enlace (href) a la página de detalles de un libro desde la página <a> dentro de una etiqueta artículo con la clase producto_pod.

A continuación se muestra un ejemplo de su estructura HTML:

De este elemento extraeremos:

  • El enlace (href) a la página de detalles del libro

Ejemplo de código Python

importar peticiones
from parsel import Selector

# Obtener la página web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(respuesta.texto)

# Seleccionar el primer producto por clase
producto = selector.css("articulo.producto_pod").get()

# Parsear el atributo 'href' del producto seleccionado
product_selector = Selector(text=producto)
book_link = product_selector.css("h3 a::attr(href)").get()

print("Enlace del libro:", book_link)

Explicación del guión:

  • Obtener la página web: El script envía una petición GET para recuperar el contenido HTML de la página web.
  • Seleccione el bloque del producto: El selector CSS article.product_pod se dirige a la primera entrada del libro.
  • Extraer el atributo href: Usando h3 a::attr(href), el script extrae el valor href de la etiqueta anidada en la etiqueta.
  • Mostrar el resultado: La URL extraída se imprime en la consola.

Ejemplo de salida

Enlace del libro: catalogue/a-light-in-the-attic_1000/index.html

Extracción de listas de elementos

Parsel simplifica la extracción de múltiples elementos de una página web mediante selectores CSS o XPath. Esto resulta especialmente útil cuando se trabaja con listas, como títulos de productos, enlaces o precios.

Nos centraremos en extraer una lista de todos los títulos de libros que aparecen en la página de inicio del sitio web de ejemplo que estamos utilizando para este tutorial.

A continuación se muestra un ejemplo de la estructura HTML correspondiente:

De estos elementos extraeremos:

  • Los títulos de todos los libros que aparecen en la página de inicio

Ejemplo de código Python

importar peticiones
from parsel import Selector

# Obtener la página web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(respuesta.texto)

# Seleccionar todos los títulos de libros
book_titles = selector.css("article.product_pod h3 a::attr(title)").getall()

# Imprimir cada título
for título in títulos_libros:
   print("Título:", título)

Explicación del guión:

  • Obtener la página web: El script envía un GET para recuperar el contenido HTML del sitio web.
  • Seleccione todos los títulos: Utilización de la CSS selector articulo.producto_pod h3 a::attr(title)selecciona todos <a> etiquetas internas <h3> etiquetas dentro de producto_pod elementos.
  • Títulos extraídos: En .getall() recupera una lista de todos los títulos coincidentes.
  • Mostrar resultados: Cada título de la lista se imprime uno a uno.

Ejemplo de salida

Título: Una luz en el ático
Title: Tipping the Velvet
Título: Soumission Soumission
Título: Sharp Objects Objetos afilados

Navegación por elementos anidados

Parsel permite navegar con eficacia por estructuras HTML complejas y anidadas mediante selectores CSS y XPath. Esto resulta especialmente útil para extraer datos ocultos en múltiples capas de etiquetas HTML.

Extraeremos el precio de un libro de dentro del producto_pod elemento.

A continuación se muestra un ejemplo de la estructura HTML correspondiente:

De esta estructura anidada, extraeremos:

  • El precio del primer libro

Ejemplo de código Python

importar peticiones
from parsel import Selector

# Obtener la página web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(respuesta.texto)

# Seleccionar el primer producto por clase
producto = selector.css("articulo.producto_pod").get()

# Analiza el elemento precio anidado
product_selector = Selector(text=producto)
price = product_selector.css("div.product_price p.price_color::text").get()

print("Precio:", precio)

Explicación del guión:

  • Obtener la página web: El script recupera el contenido HTML de la página web mediante peticiones.
  • Seleccione el primer bloque de productos: Se dirige a la primera etiqueta de artículo con la clase producto_pod.
  • Navega hasta el elemento de precio anidado: Utilización de la CSS selector div.precio_producto p.precio_colornavega hasta el div y selecciona el elemento p que contiene el precio.
  • Extraer el texto del precio: En .get() recupera el valor del precio.
  • Mostrar el resultado: Se imprime el precio extraído.

Ejemplo de salida

Precio: 51,77

Análisis sintáctico de tablas y listas

Parsel simplifica el proceso de extracción de datos estructurados a partir de listas HTML y formatos tipo tabla. Los sitios web suelen mostrar información en patrones repetitivos, como cuadrículas de productos o listas ordenadas, lo que convierte a Parsel en una herramienta esencial para capturar eficazmente estos datos.

Como ejemplo, trabajaremos de nuevo con el mismo ejemplo de sitio web. Nuestro objetivo es extraer una lista de títulos de libros junto con sus precios. En concreto, nos centraremos en <ol> que contiene varias etiquetas <li> cada uno de los cuales representa un libro.

A continuación se muestra un ejemplo de la estructura HTML correspondiente:

De esta estructura extraeremos:

  • El título de cada libro
  • El precio de cada libro

Ejemplo de código Python

import requests
from parsel import Selector

# Fetch the webpage
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Select all book items in the list
books = selector.css("ol.row li.article")

# Loop through each book and extract title and price
for book in books:
    title = book.css("h3 a::attr(title)").get()
    price = book.css("p.price_color::text").get()
    print(f"Title: {title} | Price: {price}")

Explicación del guión:

  • Obtener la página web: El script envía una petición GET para obtener el contenido HTML de la página web.
  • Seleccione todos los artículos del libro: El selector ol.fila li.artículo se dirige a todos <li> elementos dentro de la lista ordenada (<ol>), que representan elementos individuales del libro.
  • Extraer título y precio: h3 a::attr(title) extrae el atributo title del <a> etiqueta. --- p.precio_color::texto extrae el texto del precio del <p> etiqueta.
  • Muestra los resultados: El script imprime el título y el precio de cada libro.

Ejemplo de salida

Título: A Luz en el Attic | Precio: £51.77
Título Tipping el Terciopelo | Precio £53.74
Título Soumission | Precio £50.10
Título Afilado Objects | Precio: £47.82
...

Conclusión

En este tutorial, exploramos los fundamentos del análisis web en Python con Parsel. Desde la comprensión de los selectores básicos hasta la navegación por elementos anidados, la extracción de atributos y el análisis de listas, hemos demostrado cómo Parsel simplifica el proceso de extracción de datos significativos de las páginas web.

He aquí un breve resumen de lo que hemos tratado:

  • Extracción de elementos por ID y clase: Dirigido a elementos HTML específicos utilizando selectores CSS.
  • Extracción de texto y atributos: Aprendió a extraer contenido de texto y atributos como href y src de elementos.
  • Manejo de elementos anidados: Explora cómo navegar a través de las relaciones padre-hijo en las estructuras HTML.
  • Análisis sintáctico de listas: Extracción de datos estructurados a partir de patrones repetitivos, como tablas o listas de productos.

Próximos pasos:

  • Experimenta con diferentes páginas web y estructuras HTML complejas utilizando Parsel.
  • Explorar la integración con otras bibliotecas como Scrapy para proyectos de web scraping a gran escala.
  • Siga las mejores prácticas de scraping ético, como respetar los archivos robots.txt y evitar sobrecargar los servidores.

Parsel es una herramienta poderosa en el conjunto de herramientas de web scraping, y dominarla abrirá innumerables oportunidades para la recopilación y el análisis de datos.

¡Feliz análisis!