CodeGym /Cursos /Python SELF ES /Extracción de datos por etiquetas y atributos HTML

Extracción de datos por etiquetas y atributos HTML

Python SELF ES
Nivel 31 , Lección 3
Disponible

1. Navegación por el árbol HTML

Hoy nos sumergiremos en el misterioso mundo de los árboles HTML y aprenderemos a extraer información de las páginas web como auténticos ninjas programadores. Seguiremos utilizando la mágica biblioteca BeautifulSoup para llegar a los datos necesarios y añadir aún más funcionalidad a nuestros ya inteligentes scripts. Así que, prepara tu teclado y ¡vamos a empezar!

Entonces, antes de lanzarnos a extraer datos, repasemos una vez más qué es un árbol HTML. Imagínatelo como un árbol genealógico gigante, donde cada etiqueta es un pariente diferente. Hay padres, hijos, hermanos y hermanas. Nuestras tareas son encontrar a los “parientes” específicos para extraer cuidadosamente sus valiosas reliquias familiares (o datos).

Así es como podría verse un pedazo de HTML:

HTML

<div class="article">
    <h2 id="title">Título</h2>
    <p class="content">Este es el texto del artículo...</p>
    <a href="https://example.com" class="link">Leer más</a>
</div>

Aquí tenemos un div, que es el elemento padre de h2, p, y a. Cada uno de ellos tiene sus atributos y contenido.

2. Extracción de datos por etiquetas

BeautifulSoup ofrece métodos convenientes para navegar por el árbol y extraer datos. Empecemos con el método básico find(), que nos permitirá encontrar el primer elemento con una etiqueta específica. Por otro lado, find_all() es como un bulldozer de búsqueda que desentierra todos los elementos con una etiqueta especificada.

python
                      
                        from bs4 import BeautifulSoup
                
                        html_doc = """<div class="article">
                                        <h2 id="title">Título</h2>
                                        <p class="content">Este es el texto del artículo...</p>
                                        <a href="https://example.com" class="link">Leer más</a>
                                     </div>"""
                        
                        soup = BeautifulSoup(html_doc, 'html.parser')
                        
                        # Encontramos el primer párrafo
                        first_paragraph = soup.find('p')
                        print(first_paragraph.text)  # Salida: Este es el texto del artículo...
                        
                        # Encontramos todos los enlaces
                        all_links = soup.find_all('a')
                        for link in all_links:
                            print(link['href'])  # Salida: https://example.com
                      
                    

3. Uso de atributos para filtrar elementos

Ahora que hemos aprendido a buscar por etiquetas, es hora de descubrir cómo filtrar elementos usando atributos como id y class. Estos atributos son como marcadores en una página que indican qué es qué.

HTML

<div class="article">
    <h2 id="title">Título</h2>
    <p class="content">Este es el texto del artículo...</p>
    <a href="https://example.com" class="link">Leer más</a>
</div>
Python

# Encontramos un elemento con un id específico
title = soup.find(id="title")
print(title.text)  # Salida: Título

# Encontramos todos los elementos con la clase "content"
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
    print(p.text)  # Salida: Este es el texto del artículo...

¡Importante! Usamos class_ en vez de class para evitar conflictos con la palabra reservada de Python.

4. Práctica de extracción de datos con condiciones dadas

¡Ahora vamos a practicar! Imagina que necesitas extraer enlaces y textos de títulos de un gran array HTML repetitivo de artículos. Aquí tienes un ejemplo de datos y cómo trabajar con ellos:

HTML

<div class="articles">
    <div class="article">
        <h2 class="title">Primer artículo</h2>
        <a href="https://example.com/1" class="read-more">Leer más</a>
    </div>
    <div class="article">
        <h2 class="title">Segundo artículo</h2>
        <a href="https://example.com/2" class="read-more">Leer más</a>
    </div>
</div>

Y aquí está cómo podemos extraer los títulos y enlaces:

Python

html_doc = """<div class="articles">
                <div class="article">
                    <h2 class="title">Primer artículo</h2>
                    <a href="https://example.com/1" class="read-more">Leer más</a>
                </div>
                <div class="article">
                    <h2 class="title">Segundo artículo</h2>
                    <a href="https://example.com/2" class="read-more">Leer más</a>
                </div>
              </div>"""

soup = BeautifulSoup(html_doc, 'html.parser')

articles = soup.find_all('div', class_='article')
for article in articles:
    title = article.find('h2', class_='title').text
    link = article.find('a', class_='read-more')['href']
    print(f"Título: {title}, Enlace: {link}")
    
# Salida:
# Título: Primer artículo, Enlace: https://example.com/1
# Título: Segundo artículo, Enlace: https://example.com/2

5. Sobre trampas comunes

Ahora que estás armado con conocimientos, echemos un vistazo a algunos errores típicos. Uno de los problemas más comunes es intentar acceder a un atributo que no existe. Para esto Python responde de forma amigable, pero aún molesta, con KeyError. Para evitar esto, puedes usar el método .get() para obtener atributos con un valor predeterminado en caso de que estén ausentes.

Además, no olvides los elementos HTML que pueden estar anidados y tener una estructura compleja. Usa la herramienta de inspección del navegador para asegurarte de que entiendes la estructura correctamente antes de intentar extraer datos usando BeautifulSoup.

La próxima parada en nuestro emocionante viaje será el uso de selectores CSS para apuntar aún más específicamente y extraer información. Así que quédate con nosotros, ¡porque las aventuras en el mundo de BeautifulSoup apenas empiezan!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION