0Pricing
AI Agents · Lección

Análisis de HTML con BeautifulSoup

find(), select(), selectores CSS y extracción de contenido estructurado de HTML.

Análisis de HTML con BeautifulSoup es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.

¿Por qué analizar HTML en los agentes?

Muchas fuentes de datos no son API, sino páginas web. Cuando un agente necesita extraer información estructurada de HTML, debe analizar el marcado sin procesar y convertirlo en un árbol navegable.

BeautifulSoup (bs4) es la biblioteca estándar de Python para esta tarea. Convierte HTML desordenado en un objeto de Python que puede consultar fácilmente.

Creación de un objeto BeautifulSoup

Pase el HTML sin procesar y el nombre del analizador a BeautifulSoup(). 'html.parser' viene integrado en Python y no requiere ninguna instalación adicional. Para analizar páginas grandes más rápidamente, puede utilizar 'lxml', disponible mediante pip.

from bs4 import BeautifulSoup
import httpx

# Fetch HTML
response = httpx.get('https://example.com', timeout=10.0)
html = response.text

# Parse it
soup = BeautifulSoup(html, 'html.parser')

# Get the page title
print(soup.title.text)  # 'Example Domain'

find() — Buscar un solo elemento

soup.find(tag, attrs) devuelve el primer elemento coincidente o None si no encuentra ninguno. Puede buscar por nombre de etiqueta, clase, id o cualquier atributo.

Compruebe siempre si el resultado es None antes de llamar a sus métodos.

from bs4 import BeautifulSoup

html = '<div class="content"><h1>Title</h1><p>Body text here.</p></div>'
soup = BeautifulSoup(html, 'html.parser')

# Find by tag + class
content_div = soup.find('div', class_='content')
if content_div:
    heading = content_div.find('h1')
    print(heading.text)  # 'Title'

# Find by id
sidebar = soup.find('div', id='sidebar')  # None if absent

find_all() — Buscar varios elementos

soup.find_all(tag) devuelve una lista con todos los elementos coincidentes. Recorra la lista para extraer datos de estructuras repetidas, como elementos de listas, filas de tablas o tarjetas de artículos.

from bs4 import BeautifulSoup

html = '<ul><li>Apple</li><li>Banana</li><li>Cherry</li></ul>'
soup = BeautifulSoup(html, 'html.parser')

items = soup.find_all('li')
for item in items:
    print(item.text)  # Apple, Banana, Cherry

# Limit results
first_two = soup.find_all('li', limit=2)

Selectores CSS con select()

soup.select('css selector') permite utilizar la sintaxis CSS habitual. Suele ser más conciso que encadenar llamadas a find(), especialmente para elementos anidados.

from bs4 import BeautifulSoup

html = '''
<table>
  <tr><td class="name">Alice</td><td class="score">95</td></tr>
  <tr><td class="name">Bob</td><td class="score">87</td></tr>
</table>
'''
soup = BeautifulSoup(html, 'html.parser')

# Select all td elements inside tr inside table
cells = soup.select('table tr td')
for cell in cells:
    print(cell.text)

# Select only name cells
names = soup.select('td.name')
for n in names:
    print(n.text)  # Alice, Bob

Extracción de texto con .text y .strip()

.text (o .get_text()) devuelve todo el contenido de texto dentro de un elemento, incluidas las etiquetas anidadas. Utilice .strip() para eliminar los espacios en blanco iniciales y finales que suele contener el HTML.

from bs4 import BeautifulSoup

html = '<p>  \n  Price: <strong>$29.99</strong>  \n  </p>'
soup = BeautifulSoup(html, 'html.parser')

paragraph = soup.find('p')

# .text includes nested tag content
print(paragraph.text)          # '  \n  Price: $29.99  \n  '
print(paragraph.text.strip())  # 'Price: $29.99'

# get_text with separator
print(paragraph.get_text(separator=' ', strip=True))  # 'Price: $29.99'

Extracción de atributos con .get()

Se accede a los atributos de las etiquetas, como href, src y data-*, como si fueran elementos de un diccionario mediante .get('attr_name'). Este método devuelve None de forma segura si falta el atributo.

from bs4 import BeautifulSoup

html = '''
<a href="https://example.com/page" data-id="42">Click here</a>
<img src="/images/logo.png" alt="Logo">
'''
soup = BeautifulSoup(html, 'html.parser')

link = soup.find('a')
print(link.get('href'))     # 'https://example.com/page'
print(link.get('data-id'))  # '42'
print(link.get('class'))    # None (no class attribute)

img = soup.find('img')
print(img.get('src'))       # '/images/logo.png'

Navegación por el árbol de análisis

Los elementos de BeautifulSoup tienen relaciones de elemento principal, elemento secundario y elementos hermanos que puede recorrer. Utilice .parent, .children, .next_sibling y .previous_sibling para desplazarse por los elementos alrededor de un elemento encontrado.

from bs4 import BeautifulSoup

html = '''
<div class="article">
  <h2>Headline</h2>
  <p>First paragraph.</p>
  <p>Second paragraph.</p>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')

h2 = soup.find('h2')
print(h2.text)                    # 'Headline'
print(h2.parent['class'])         # ['article']
print(h2.next_sibling.next_sibling.text)  # 'First paragraph.'

Extracción de todos los enlaces de una página

Una tarea habitual de los agentes es recopilar todos los enlaces de una página para rastrearlos posteriormente. Busque todas las etiquetas <a> y extraiga sus atributos href, descartando los que estén vacíos.

from bs4 import BeautifulSoup
import httpx

def extract_links(url: str) -> list:
    response = httpx.get(url, timeout=10.0)
    soup = BeautifulSoup(response.text, 'html.parser')

    links = []
    for tag in soup.find_all('a'):
        href = tag.get('href')
        if href and href.startswith('http'):
            links.append(href)
    return links

# urls = extract_links('https://news.ycombinator.com')
# print(urls[:5])

Gestión adecuada de HTML mal formado

El HTML del mundo real suele estar incompleto: etiquetas sin cerrar, elementos que no coinciden y problemas de codificación. El analizador de BeautifulSoup es tolerante e intentará corregir los errores automáticamente. No obstante, proteja siempre el acceso a elementos anidados contra valores None.

from bs4 import BeautifulSoup

# Broken HTML — missing closing tags
html = '<div><p>Hello <strong>World</div>'
soup = BeautifulSoup(html, 'html.parser')

# BS4 repairs the tree automatically
print(soup.prettify())
# <div><p>Hello <strong>World</strong></p></div>

# Safe chained access
price = soup.find('span', class_='price')
price_text = price.text.strip() if price else 'N/A'
print(price_text)  # 'N/A'

Herramienta completa de scraping para agentes

Todo en conjunto: una función completa de scraping que el agente puede invocar como herramienta. Obtiene una página, la analiza y devuelve datos estructurados en un formato que el agente puede procesar.

from bs4 import BeautifulSoup
import httpx

def scrape_article(url: str) -> dict:
    response = httpx.get(url, headers={'User-Agent': 'MyAgent/1.0'}, timeout=10.0)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')

    title = soup.find('h1')
    paragraphs = soup.find_all('p')

    return {
        'url': url,
        'title': title.text.strip() if title else '',
        'text': ' '.join(p.text.strip() for p in paragraphs[:5]),
        'links': [a.get('href') for a in soup.find_all('a', href=True)][:10]
    }

Comprobación de conocimientos: BeautifulSoup

Compruebe sus conocimientos sobre el análisis de HTML con BeautifulSoup.

Resumen: análisis de HTML con BeautifulSoup

Ahora puede extraer datos estructurados de páginas HTML en sus agentes:

  • Cree un objeto soup con BeautifulSoup(html, 'html.parser')
  • Use find() para un solo elemento y find_all() para varios
  • Use select() para realizar consultas con selectores CSS
  • Obtenga el texto con .text.strip() y los atributos con .get('attr')
  • Recorra el árbol con .parent, .children y los elementos hermanos

Combinado con un cliente HTTP, BeautifulSoup permite que su agente lea cualquier página web.

Preguntas frecuentes

¿La lección «Análisis de HTML con BeautifulSoup» es gratis?

Sí — el texto completo de «Análisis de HTML con BeautifulSoup» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.

¿Qué aprenderé en «Análisis de HTML con BeautifulSoup»?

find(), select(), selectores CSS y extracción de contenido estructurado de HTML. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Agents?

No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Análisis de HTML con BeautifulSoup»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Agents?

Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Clientes HTTP para agentes: httpx y requests
  2. Análisis de HTML con BeautifulSoup
  3. Gestión de la paginación y el contenido dinámico
  4. Prácticas responsables de scraping
← Volver a AI Agents