Pandas y Beautiful Soup: extrae datos de una web con Python

Python · Datos · Web scraping

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
Uso responsable: revisa los términos del sitio y su archivo 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.

Explorar más tutoriales de Python →

Comentarios

Entradas populares de este blog

Inicios de un Gran Proyecto: cómo convertir una idea en realidad

Historia de la Computación: desde el ábaco hasta la Inteligencia Artificial

Código Máquina: Qué es, cómo funciona y ejemplos prácticos en Linux x86-64