🌗 ← Índice
Data: 14/08/2026
Nível: Intermediário-Avançado (Mês 3 — Projetos Reais)
pip install beautifulsoup4 requests
<!DOCTYPE html>
<html>
<body>
<h1 class="titulo">Últimas Notícias</h1>
<div class="noticia">
<h2 class="manchete"><a href="/n1">Python lança versão nova</a></h2>
<p class="data">14/08/2026</p>
</div>
</body>
</html>
import requests
from bs4 import BeautifulSoup
resposta = requests.get("https://exemplo.com", timeout=10)
soup = BeautifulSoup(resposta.text, "html.parser")
titulo = soup.find("h1", class_="titulo")
print(titulo.get_text()) # "Últimas Notícias"
💡 `resposta.text` traz o HTML bruto; o BeautifulSoup transforma em árvore pesquisável.
# find — primeiro que encontra
manchete = soup.find("h2", class_="manchete")
# find_all — todos
noticias = soup.find_all("div", class_="noticia")
# CSS selectors
manchetes = soup.select("h2.manchete")
links = soup.select("div.noticia a")
for noticia in noticias:
titulo = noticia.find("h2").get_text()
link = noticia.find("a")["href"] # atributo
data = noticia.find("p", class_="data").get_text()
print(f"{titulo} ({data}) → {link}")
| Método | Uso |
|---|---|
| `find(tag, class_=...)` | primeiro elemento |
| `find_all(tag, class_=...)` | todos |
| `select(css)` | seletor CSS (`.classe`, `#id`, `a[href]`) |
| `.get_text()` | texto limpo |
| `elemento["atributo"]` | valor de atributo |
| `.strip()` | remove espaços |
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"
}
resposta = requests.get("https://exemplo.com", headers=headers, timeout=10)
Muitos sites bloqueiam requests sem User-Agent (ou com o padrão do `requests`).
titulo = soup.find("h1")
if titulo:
print(titulo.get_text())
else:
print("Elemento não encontrado — a página pode ter mudado")
import time
import requests
from bs4 import BeautifulSoup
headers = {"User-Agent": "MeuEstudoBot/1.0 (contato@exemplo.com)"}
for pagina in range(1, 4):
resposta = requests.get(f"https://exemplo.com/pagina/{pagina}", headers=headers, timeout=10)
soup = BeautifulSoup(resposta.text, "html.parser")
# ... processa ...
time.sleep(2) # ⚠️ respeite o servidor — não faça requests em rajada
⚠️ **Sempre verifique:** `robots.txt` (ex: `https://site.com/robots.txt`), termos de uso e leis locais. Raspe apenas dados públicos, com moderação e para fins de estudo.
Crie um script cotacoes.py que:
[
{"texto": "...", "autor": "...", "tags": ["life", "inspirational"]}
]
import json
import time
import requests
from bs4 import BeautifulSoup
headers = {"User-Agent": "MeuEstudoBot/1.0"}
resultado = []
for pagina in range(1, 4):
resposta = requests.get(
f"https://quotes.toscrape.com/page/{pagina}/",
headers=headers,
timeout=10,
)
soup = BeautifulSoup(resposta.text, "html.parser")
for citação in soup.select("div.quote"):
texto = citação.select_one("span.text").get_text().strip()
autor = citação.select_one("small.author").get_text().strip()
tags = [tag.get_text() for tag in citação.select("a.tag")]
resultado.append({"texto": texto, "autor": autor, "tags": tags})
time.sleep(1)
with open("cotacoes.json", "w", encoding="utf-8") as f:
json.dump(resultado, f, ensure_ascii=False, indent=2)
print(f"Salvas {len(resultado)} citações em cotacoes.json")
💡 Resultado esperado: 30 citações (10 por página × 3) salvas em JSON.
HB Estudos · ← Voltar ao índice de Python