Análise de HTML com BeautifulSoup
Navegue pela árvore sintática e extraia dados com seletores.
Análise de HTML com BeautifulSoup é uma aula grátis de Python Academy 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 Python Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Python Academy inclui 4 aulas no total.
Instalando BeautifulSoup
beautifulsoup4 analisa HTML e XML. Use o analisador lxml para obter velocidade ou html.parser para uma utilização sem dependências adicionais.
# pip install beautifulsoup4 lxml
from bs4 import BeautifulSoup
html = "<h1>Hello</h1><p class='intro'>World</p>"
soup = BeautifulSoup(html, "lxml")
print(soup.h1.text) # HelloEncontrando elementos
find(tag) retorna o primeiro elemento correspondente. find_all(tag) retorna uma lista de todos os elementos correspondentes.
from bs4 import BeautifulSoup
html = "<ul><li>A</li><li>B</li><li>C</li></ul>"
soup = BeautifulSoup(html, "lxml")
print(soup.find("li").text) # A
print([li.text for li in soup.find_all("li")]) # [A,B,C]Seletores CSS
soup.select("css selector") usa a sintaxe CSS. soup.select_one() retorna a primeira correspondência.
from bs4 import BeautifulSoup
html = '<div class="card"><a href="/p/1">Link 1</a></div>'
soup = BeautifulSoup(html, "lxml")
print(soup.select("div.card a")[0]["href"]) # /p/1
print(soup.select_one("a")["href"]) # /p/1Acessando atributos
Acesse os atributos de um elemento como em um dicionário: tag["href"], tag.get("class", []).
from bs4 import BeautifulSoup
html = '<a href="https://example.com" class="link external">Click</a>'
soup = BeautifulSoup(html, "lxml")
a = soup.find("a")
print(a["href"]) # https://example.com
print(a.get("class", [])) # ['link', 'external']Navegando pela árvore de análise
Use .parent, .children, .next_sibling, .previous_sibling para percorrer a árvore.
from bs4 import BeautifulSoup
html = "<div><h2>Title</h2><p>Para</p></div>"
soup = BeautifulSoup(html, "lxml")
h2 = soup.find("h2")
print(h2.parent.name) # div
print(h2.next_sibling.text) # Para (next sibling)Extraindo texto
tag.get_text(separator=" ", strip=True) retorna todo o texto dentro de um elemento, com os espaços em branco ajustados.
from bs4 import BeautifulSoup
html = "<div> <p>Hello</p> <p> World </p> </div>"
soup = BeautifulSoup(html, "lxml")
print(soup.div.get_text(separator=" ", strip=True))
# Hello WorldExtraindo dados com requests + BeautifulSoup
Busque uma página com requests e analise-a com BeautifulSoup — a combinação clássica para extração de dados.
import requests
from bs4 import BeautifulSoup
url = "https://books.toscrape.com"
r = requests.get(url, timeout=10)
soup = BeautifulSoup(r.text, "lxml")
titles = [h3.find("a")["title"] for h3 in soup.select("article.product_pod h3")]
print(titles[:3])Lidando com URLs relativas
Use urllib.parse.urljoin(base, href) para converter links relativos em URLs absolutas.
from urllib.parse import urljoin
base = "https://example.com/products/"
href = "../about"
print(urljoin(base, href)) # https://example.com/aboutLidando com codificações
BeautifulSoup detecta a codificação automaticamente, mas é possível especificá-la ou usar r.encoding do requests.
import requests
from bs4 import BeautifulSoup
r = requests.get("https://example.com")
print(r.encoding) # e.g. utf-8
soup = BeautifulSoup(r.content, "lxml", from_encoding=r.encoding)Modificando e serializando
Modifique a árvore de análise e converta-a novamente para HTML com str(tag) ou soup.prettify().
from bs4 import BeautifulSoup
html = "<p>Hello <b>world</b></p>"
soup = BeautifulSoup(html, "lxml")
soup.b.decompose() # remove the <b> tag
print(str(soup.p)) # <p>Hello </p>Limitações do BeautifulSoup
O BS4 analisa HTML estático. Ele não consegue executar JavaScript. Para páginas renderizadas por JS, use Playwright ou Selenium.
# BeautifulSoup: good for static HTML
# Playwright: for JavaScript-rendered SPAs
# Scrapy: for large-scale crawls with pipelines
# pip install playwright
# playwright install
# from playwright.async_api import async_playwrightVerificação rápida
Qual método retorna todos os elementos correspondentes a um seletor CSS no BeautifulSoup?
Revisão
BeautifulSoup analisa HTML em uma árvore navegável. Use find()/find_all() para pesquisar elementos, select() para seletores CSS e get_text() para obter texto limpo. Combine-o com requests para páginas estáticas; use Playwright para conteúdo renderizado por JS.
Perguntas Frequentes
A aula “Análise de HTML com BeautifulSoup” é grátis?
Sim — o texto completo de “Análise de 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 Python Academy, atualize para CoddyKit PRO. O curso de Python Academy inclui 4 aulas no total.
O que vou aprender em “Análise de HTML com BeautifulSoup”?
Navegue pela árvore sintática e extraia dados com seletores. Você pratica Python Academy 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 Python Academy?
Nenhuma experiência prévia é necessária. Python Academy 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 “Análise de 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 Python Academy?
Sim. Cada aula de Python Academy 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
- Requisições HTTP com requests e httpx
- Análise de HTML com BeautifulSoup
- Criação de um spider com Scrapy
- Tratamento de JavaScript e medidas antirraspagem