Você encontrou o dataset perfeito. Ele está bem ali em uma página web, formatado bonitinho em uma tabela HTML. Você só precisa colocá-lo no Pandas.
Quão difícil pode ser?
O One-Liner (Quando Funciona)
O Pandas tem uma função nativa para isso:
import pandas as pd
tables = pd.read_html('https://example.com/page-with-table')
df = tables[0] # Primeira tabela na página
Isso é lindo quando funciona. Três linhas, pronto.
Mas eis o que os tutoriais não te contam: pd.read_html() falha em um número surpreendente de sites do mundo real.
Tabelas renderizadas por JavaScript? O Pandas não consegue vê-las. Ele só lê o HTML bruto.
Tabelas que requerem autenticação? Você vai precisar lidar com sessões e cookies primeiro.
Estruturas aninhadas complexas? O parsing pode produzir lixo.
Medidas anti-scraping? Você vai ser bloqueado ou receber conteúdo diferente.
Para tabelas HTML simples e estáticas em páginas públicas, pd.read_html() é ótimo. Para todo o resto, você precisa de alternativas.
A Abordagem Requests + BeautifulSoup
Quando pd.read_html() falha, o próximo passo geralmente é:
import requests
from bs4 import BeautifulSoup
import pandas as pd
response = requests.get('https://example.com/page')
soup = BeautifulSoup(response.content, 'html.parser')
table = soup.find('table', {'class': 'data-table'})
# Extrair cabeçalhos
headers = [th.text.strip() for th in table.find_all('th')]
# Extrair linhas
rows = []
for tr in table.find_all('tr')[1:]:
row = [td.text.strip() for td in tr.find_all('td')]
if row:
rows.append(row)
df = pd.DataFrame(rows, columns=headers)
Isso te dá mais controle. Você pode mirar em tabelas específicas, lidar com edge cases, limpar dados durante a extração.
As desvantagens:
- Mais código para escrever e manter
- Ainda não consegue lidar com conteúdo renderizado por JavaScript
- Quebra quando a estrutura do site muda
A Opção Nuclear: Selenium
Para sites pesados em JavaScript:
from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
driver = webdriver.Chrome()
driver.get('https://example.com/page')
# Esperar o JavaScript renderizar
import time
time.sleep(3)
# Agora parsear o HTML renderizado
table = driver.find_element(By.CSS_SELECTOR, 'table.data-table')
# ... lógica de extração similar ao BeautifulSoup
driver.quit()
Isso funciona em quase tudo. O navegador renderiza a página completamente, JavaScript e tudo, então você extrai os dados.
O custo:
- Lento (segundos por página em vez de milissegundos)
- Requer configuração do driver do navegador
- Pesado em recursos
- Parece exagero para pegar uma tabela
O Jeito Preguiçoso (Meu Favorito)
Eis o que eu realmente faço na maioria das vezes:
- Abro a página no navegador
- Exporto a tabela para CSV com uma extensão de navegador
- Carrego no Pandas:
df = pd.read_csv('tabela_exportada.csv')
Pronto. Sem código de scraping. Sem depurar seletores HTML. Sem lidar com edge cases em Python.
O navegador já renderizou o JavaScript. A extensão lida com o parsing HTML e limpeza de dados. Eu recebo um arquivo CSV limpo que o Pandas lê sem problemas.
Eu uso o HTML Table Exporter para isso: ele detecta tabelas automaticamente e exporta para CSV, JSON ou Excel com um clique. Roda localmente, nenhum dado é enviado para lugar nenhum.
Para um guia completo de como as melhores extensões Chrome se comparam para exportar tabelas, confira nosso comparativo das 5 melhores extensões.
Mas existem outras ferramentas também. O ponto é: às vezes o caminho mais rápido para um DataFrame não passa pelo Python.
Quando Usar O Quê
Aqui vai minha árvore de decisão:
Use pd.read_html() quando:
- Tabela HTML simples e estática
- Página pública, sem autenticação
- Você precisa automatizar buscas repetidas
Use BeautifulSoup quando:
-
pd.read_html()falha - Você precisa de controle preciso sobre a extração
- A estrutura da tabela é incomum
Use Selenium quando:
- JavaScript renderiza a tabela
- Você precisa interagir com a página primeiro
- Automação é necessária
Use exportação via navegador quando:
- Coleta pontual de dados
- Página complexa que seria dolorosa de scrapear
- Você quer os dados em 30 segundos, não em 30 minutos
Um Exemplo Prático
Digamos que você quer dados de PIB do Banco Mundial que estão exibidos em uma tabela no site deles.
A abordagem pd.read_html():
import pandas as pd
url = 'https://data.worldbank.org/indicator/NY.GDP.MKTP.CD'
tables = pd.read_html(url)
# Torcer para que funcione e descobrir qual índice de tabela você precisa
for i, table in enumerate(tables):
print(f"Tabela {i}: {table.shape}")
Às vezes funciona. Às vezes a tabela é carregada via JavaScript e você não obtém nada útil.
A abordagem de exportação via navegador:
- Abra a página
- Clique no botão de exportar na sua extensão
- Escolha CSV
df = pd.read_csv('pib_banco_mundial.csv')
Tempo total: cerca de 30 segundos.
Eu costumava sentir que isso era "trapaça" — engenheiros de dados de verdade escrevem scrapers, certo? Mas então percebi que obter os dados rápida e precisamente é o objetivo real. O método é apenas um meio para um fim.
A Conclusão
pd.read_html() é subestimado para casos simples. Exportação via navegador é subestimada para casos complexos. E escrever um scraper customizado deveria ser seu último recurso, não seu primeiro instinto.
Combine a ferramenta com o trabalho. Seu tempo vale mais do que provar que consegue parsear HTML em Python.
Saiba mais sobre o HTML Table Exporter ou experimente grátis na Chrome Web Store. Qual é seu método favorito para pegar tabelas da web? Me conta nos comentários.
Top comments (0)