CodeGym /Cursos /Python SELF PT /Extraindo dados de tags e atributos HTML

Extraindo dados de tags e atributos HTML

Python SELF PT
Nível 31 , Lição 3
Disponível

1. Navegando na árvore HTML

Hoje vamos mergulhar no misterioso mundo das árvores HTML e aprender a extrair informações de páginas da web como verdadeiros ninjas programadores. Continuaremos usando a mágica biblioteca BeautifulSoup para buscar os dados necessários e deixar nossos scripts, já bastante inteligentes, com ainda mais funcionalidades. Então, prepare seu teclado e vamos lá!

Então, antes de começar a extração de dados, vamos revisar o que é mesmo uma árvore HTML. Imagine isso como uma enorme árvore genealógica, onde cada tag é um parente separado. Temos pais, filhos, irmãos e irmãs. Nossa missão é encontrar os "parentes" certos para extrair com cuidado as preciosas relíquias de família (ou, neste caso, dados).

Veja como pode ser um pedaço de HTML:

HTML

<div class="article">
    <h2 id="title">Título</h2>
    <p class="content">Este é o texto do artigo...</p>
    <a href="https://example.com" class="link">Leia mais</a>
</div>

Aqui temos um div, que é o elemento pai de h2, p, e a. Cada um deles possui seus atributos e conteúdos.

2. Extraindo dados por tags

BeautifulSoup oferece métodos práticos para navegar pela árvore e extrair dados. Vamos começar com o método básico find(), que nos permite encontrar o primeiro elemento com uma tag específica. Já o find_all() é como um trator de busca, que desenterra todos os elementos com a tag especificada.

python
                      
                        from bs4 import BeautifulSoup
                
                        html_doc = """<div class="article">
                                        <h2 id="title">Título</h2>
                                        <p class="content">Este é o texto do artigo...</p>
                                        <a href="https://example.com" class="link">Leia mais</a>
                                     </div>"""
                        
                        soup = BeautifulSoup(html_doc, 'html.parser')
                        
                        # Encontramos o primeiro parágrafo
                        first_paragraph = soup.find('p')
                        print(first_paragraph.text)  # Saída: Este é o texto do artigo...
                        
                        # Encontramos todos os links
                        all_links = soup.find_all('a')
                        for link in all_links:
                            print(link['href'])  # Saída: https://example.com
                      
                    

3. Usando atributos para filtrar elementos

Agora que dominamos a busca por tags, é hora de aprender como filtrar elementos usando atributos como id e class. Esses atributos são como marcadores em uma página, que mostram o que é o que.

HTML

<div class="article">
    <h2 id="title">Título</h2>
    <p class="content">Este é o texto do artigo...</p>
    <a href="https://example.com" class="link">Leia mais</a>
</div>
Python

# Encontramos o elemento com id específico
title = soup.find(id="title")
print(title.text)  # Saída: Título

# Encontramos todos os elementos com a classe "content"
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
    print(p.text)  # Saída: Este é o texto do artigo...

Importante! Usamos class_ em vez de class — isso é pra evitar conflito com a palavra reservada do Python.

4. Prática de extração de dados com condições específicas

Agora vamos praticar! Imagine que você precisa extrair links e textos de títulos de uma grande coleção repetitiva de artigos HTML. Aqui está um exemplo dos dados e como lidar com eles:

HTML

<div class="articles">
    <div class="article">
        <h2 class="title">Primeiro artigo</h2>
        <a href="https://example.com/1" class="read-more">Leia mais</a>
    </div>
    <div class="article">
        <h2 class="title">Segundo artigo</h2>
        <a href="https://example.com/2" class="read-more">Leia mais</a>
    </div>
</div>

E aqui está como podemos extrair os títulos e links:

Python

html_doc = """<div class="articles">
                <div class="article">
                    <h2 class="title">Primeiro artigo</h2>
                    <a href="https://example.com/1" class="read-more">Leia mais</a>
                </div>
                <div class="article">
                    <h2 class="title">Segundo artigo</h2>
                    <a href="https://example.com/2" class="read-more">Leia mais</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}, Link: {link}")
    
# Saída:
# Título: Primeiro artigo, Link: https://example.com/1
# Título: Segundo artigo, Link: https://example.com/2

5. Sobre armadilhas

Agora que você está armado com conhecimento, vamos dar uma olhada em alguns erros típicos. Um dos mais comuns é tentar acessar um atributo que não existe. Para isso, o Python responde com um KeyError amigável, mas ainda assim desagradável. Para evitar isso, você pode usar o método .get() para obter atributos com um valor padrão, caso estejam ausentes.

Além disso, não se esqueça de que os elementos HTML podem ser aninhados e ter uma estrutura complexa. Use a ferramenta de inspeção de código-fonte da página no navegador, para garantir que você entende a estrutura corretamente antes de tentar extrair dados com BeautifulSoup.

Nossa próxima parada nesta fascinante jornada será o uso de seletores CSS, para ainda mais precisão na extração de informações. Então, fiquem ligados, porque as aventuras no mundo do BeautifulSoup estão só começando!

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION