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.
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.
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:
<h1>
, <p>
, <img>
).id
, clase
, href
).Los selectores XPath y CSS son lenguajes de consulta utilizados para seleccionar elementos en un documento HTML:
Más información sobre los selectores aquí.
Antes de empezar con Parsel, asegúrate de lo siguiente:
pip install parsel peticiones
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_pod
que representa una única entrada de libro.
A continuación se muestra un ejemplo de su estructura HTML:
De este elemento extraeremos:
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:
GET
al sitio web de ejemplo para recuperar su contenido HTML.articulo.producto_pod
para seleccionar la primera entrada de libro de la página.producto_pod
bloque.Título: Una luz en el desván
Precio: 51,77
Disponibilidad: En stock
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:
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)
GET
para recuperar el contenido HTML del sitio web.producto_pod
El selector CSS se dirige a la primera entrada del libro.h3 a::attr(title)
el script extrae el atributo title del archivo <a>
anidada en la etiqueta <h3>
etiqueta.Texto del título: Una luz en el ático
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:
href
) a la página de detalles del libroimportar 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:
Enlace del libro: catalogue/a-light-in-the-attic_1000/index.html
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:
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:
GET
para recuperar el contenido HTML del sitio web. articulo.producto_pod h3 a::attr(title)
selecciona todos <a>
etiquetas internas <h3>
etiquetas dentro de producto_pod
elementos..getall()
recupera una lista de todos los títulos coincidentes.Título: Una luz en el ático
Title: Tipping the Velvet
Título: Soumission Soumission
Título: Sharp Objects Objetos afilados
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:
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:
producto_pod
.div.precio_producto p.precio_color
navega hasta el div y selecciona el elemento p
que contiene el precio..get()
recupera el valor del precio.Precio: 51,77
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:
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}")
ol.fila
li.artículo
se dirige a todos <li> elementos dentro de la lista ordenada (<ol>), que representan elementos individuales del libro.h3 a::attr(title)
extrae el atributo title del <a>
etiqueta. --- p.precio_color::texto
extrae el texto del precio del <p>
etiqueta.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
...
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:
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!