Pandas y Beautiful Soup: extrae datos de una web con Python
De una página web a un DataFrame
Aprende a extraer información con Beautiful Soup, limpiarla con pandas y guardarla en CSV mediante un proyecto práctico.
Internet está lleno de datos útiles. En este tutorial construiremos un pequeño flujo ETL: descargaremos HTML, localizaremos sus elementos, convertiremos los resultados en una tabla y exportaremos un archivo reutilizable.
1. Prepara el entorno
Crea una carpeta, abre la terminal dentro de ella e instala las tres dependencias. requests descarga la página, Beautiful Soup interpreta el HTML y pandas organiza los datos.
python -m venv .venv
# Linux/macOS: source .venv/bin/activate
# Windows: .venv\Scripts\activate
pip install pandas beautifulsoup4 requests
robots.txt, identifica tu cliente, limita la frecuencia de peticiones y nunca recopiles información privada.2. Aprende pandas con una tabla pequeña
Un DataFrame es una tabla con filas y columnas. Puedes crearlo desde listas, diccionarios, CSV, Excel o una base de datos.
import pandas as pd
datos = {"producto": ["Teclado", "Ratón", "Monitor"],
"precio": [29.90, 18.50, 189.00]}
df = pd.DataFrame(datos)
df["precio_con_iva"] = (df["precio"] * 1.21).round(2)
print(df.sort_values("precio"))
df.to_csv("productos.csv", index=False)
3. Entiende Beautiful Soup
Descarga
requests.get() obtiene el HTML. Usa un tiempo máximo y comprueba los errores.
Selecciona
select() acepta selectores CSS: clases, etiquetas, atributos y combinaciones.
import requests
from bs4 import BeautifulSoup
url = "https://quotes.toscrape.com/"
respuesta = requests.get(url, timeout=15)
respuesta.raise_for_status()
soup = BeautifulSoup(respuesta.text, "html.parser")
for cita in soup.select(".quote"):
texto = cita.select_one(".text").get_text(strip=True)
autor = cita.select_one(".author").get_text(strip=True)
print(autor, texto)
4. Proyecto completo: scraper a CSV
Este ejemplo une ambas bibliotecas, recorre varias páginas y evita terminar silenciosamente cuando cambia el HTML.
import time, requests
import pandas as pd
from bs4 import BeautifulSoup
filas = []
for pagina in range(1, 4):
url = f"https://quotes.toscrape.com/page/{pagina}/"
r = requests.get(url, timeout=15)
r.raise_for_status()
soup = BeautifulSoup(r.text, "html.parser")
for bloque in soup.select(".quote"):
filas.append({
"cita": bloque.select_one(".text").get_text(strip=True),
"autor": bloque.select_one(".author").get_text(strip=True),
"etiquetas": ", ".join(
x.get_text(strip=True)
for x in bloque.select(".tag")
)
})
time.sleep(1)
df = pd.DataFrame(filas).drop_duplicates()
df.to_csv("citas.csv", index=False, encoding="utf-8-sig")
print(f"Guardadas {len(df)} citas")
Ver y descargar ejemplos de Python →
5. Aprende también en vídeo
Curso de pandas
Web scraping con Python
Continúa aprendiendo Python
Practica modificando los selectores, añade nuevas columnas y analiza el CSV resultante.
Comentarios
Publicar un comentario
Hola amigos/as dejad vuestros comentarios, gracias 🙂