Analisando HTML com BeautifulSoup
find(), select(), seletores CSS e extração de conteúdo estruturado de HTML.
Analisando HTML com BeautifulSoup é uma aula grátis de AI Agents no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Agents, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Agents inclui 4 aulas no total.
Por que analisar HTML em agentes?
Muitas fontes de dados não são APIs — são páginas da web. Quando um agente precisa extrair informações estruturadas de HTML, ele deve analisar a marcação bruta e transformá-la em uma árvore navegável.
BeautifulSoup (bs4) é a biblioteca Python padrão para isso. Ela transforma HTML desorganizado em um objeto Python que você pode consultar facilmente.
Criando um objeto BeautifulSoup
Passe o HTML bruto e o nome de um analisador para BeautifulSoup(). O 'html.parser' já vem integrado ao Python e não exige nenhuma instalação adicional. Para analisar páginas grandes com mais rapidez, 'lxml' está disponível via 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() — Encontrando um único elemento
soup.find(tag, attrs) retorna o primeiro elemento correspondente ou None se nenhum for encontrado. Você pode fazer a correspondência pelo nome da tag, pela classe, pelo identificador ou por qualquer atributo.
Verifique sempre se o resultado é None antes de chamar métodos nele.
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 absentfind_all() — Encontrando vários elementos
soup.find_all(tag) retorna uma lista com todos os elementos correspondentes. Percorra essa lista para extrair dados de estruturas repetidas, como itens de listas, linhas de tabelas ou cartões de artigos.
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)Seletores CSS com select()
soup.select('css selector') permite usar a conhecida sintaxe CSS. Muitas vezes, isso é mais conciso do que encadear chamadas a find(), especialmente para elementos aninhados.
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, BobExtraindo texto com .text e .strip()
.text (ou .get_text()) retorna todo o conteúdo textual dentro de um elemento, incluindo tags aninhadas. Use .strip() para remover espaços em branco no início e no fim, que são comuns em 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'Extraindo atributos com .get()
Atributos de tags, como href, src e data-*, são acessados como um dicionário usando .get('attr_name'). Se o atributo estiver ausente, esse método retornará None com segurança.
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'Navegando pela árvore de análise
Os elementos BeautifulSoup têm relações de pai, filho e irmão que você pode percorrer. Use .parent, .children, .next_sibling e .previous_sibling para navegar ao redor de um 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.'Extraindo todos os links de uma página
Uma tarefa comum de um agente é coletar todos os links de uma página para realizar uma exploração adicional. Encontre todas as tags <a> e extraia seus atributos href, filtrando os que estiverem vazios.
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])Lidando adequadamente com HTML malformado
O HTML do mundo real costuma estar danificado: tags não fechadas, elementos incompatíveis e problemas de codificação. O analisador do BeautifulSoup é tolerante e tentará corrigir os erros automaticamente. Ainda assim, sempre trate o caso None ao acessar elementos aninhados.
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'Ferramenta completa de extração para agentes
Reunindo tudo: uma função completa de extração que um agente pode chamar como ferramenta. Ela busca uma página, analisa seu conteúdo e retorna dados estruturados em um formato que o agente consegue interpretar.
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]
}Verificação de conhecimentos: BeautifulSoup
Teste sua compreensão da análise de HTML com BeautifulSoup.
Recapitulação: analisando HTML com BeautifulSoup
Agora você pode extrair dados estruturados de páginas HTML dentro dos seus agentes:
- Crie um objeto de análise com
BeautifulSoup(html, 'html.parser') - Use
find()para um único elemento efind_all()para vários - Use
select()para consultas com seletores CSS - Obtenha o texto com
.text.strip()e os atributos com.get('attr') - Navegue pela árvore com
.parent,.childrene os elementos irmãos
Combinado com um cliente HTTP, BeautifulSoup dá ao seu agente a capacidade de ler qualquer página da web.
Perguntas Frequentes
A aula “Analisando HTML com BeautifulSoup” é grátis?
Sim — o texto completo de “Analisando HTML com BeautifulSoup” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Agents, atualize para CoddyKit PRO. O curso de AI Agents inclui 4 aulas no total.
O que vou aprender em “Analisando HTML com BeautifulSoup”?
find(), select(), seletores CSS e extração de conteúdo estruturado de HTML. Você pratica AI Agents com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Agents?
Nenhuma experiência prévia é necessária. AI Agents no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Analisando HTML com BeautifulSoup”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Agents?
Sim. Cada aula de AI Agents inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Clientes HTTP para agentes: httpx e requests
- Analisando HTML com BeautifulSoup
- Lidando com paginação e conteúdo dinâmico
- Práticas responsáveis de raspagem