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:
<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.
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.
<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>
# 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:
<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:
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!
GO TO FULL VERSION