Beautiful Soup e Ambiente de Trabalho
Beautiful Soup é uma bbilioteca Python para extrair dados de arquivos HTML ou XML. Ela converte automaticamente documentos de entrada para codificação Unicode e saída para UTF-8, simplificando o manuseio de diferentes encodings. Para analisadores, recomenda-se usar lxml devido à sua eficiência, embora o módulo padrão html.parser e html5lib também sejam opções viáveis com diferentes trade-offs entre velocidade e tolerância a erros.
Elementos Fundamentais da Classe BeautifulSoup
A classe BeautifulSoup representa a árvore do documento. Ao acessar um tag como documento.tag, retorna o primeiro elemento correspondente no documento. Cada tag possui atributos essenciais: name (nome do tag), attrs (atributos como dicionário) e string (texto interno não atributo).
Exemplo de Uso Básico
from bs4 import BeautifulSoup
html_exemplo = '<div class="container"><p id="paragrafo1">Texto importante</p></div>'
documento = BeautifulSoup(html_exemplo, 'lxml')
elemento_div = documento.div
print(elemento_div.name) # Saída: 'div'
print(elemento_div.attrs) # Saída: {'class': ['container']}
print(elemento_div.string) # Saída: 'Texto importante'
Navegação na Árvore do Documento
Navegação Descendente
Use .contents para obter uma lista de filhos diretos ou .children para um iterável. Para todos os descendentes, utilize .descendants.
Navegação Ascendente e Lateral
.parent retorna o pai imediato; .parents itera sobre ancestrais. Para nós adjacentes, .next_sibling e .previous_sibling acessam irmãos na ordem do documento, com variantes iteráveis (.next_siblings, .previous_siblings).
Formatação e Extração de Texto
O método prettify() formata a saída HTML de forma legível. Para obter texto, use .string em tags com conteúdo único; caso contrário, retorne None. Em vez disso, empregue .text ou .get_text() para concatenar todo o texto interno, incluindo de tags filhas. Para múltiplas strings, .strings itera sobre elas, e .stripped_strings remove espaços em branco desnecessários.
Métodos de Busca na Árvore
Introdução aos Filtros
Filtros podem ser strings, expressões regulares, listas, booleanos ou funções. Por exemplo, para localizar todas as tags <a>:
links = documento.find_all('a')
print(links) # Retorna lista de tags 'a'
Uso de find() e find_all()
find_all() retorna todos os tags correspondentes como lista; find() devolve apenas o primeiro ou None se não encontrado. Ambos aceitam argumentos como name, attrs e parâmetros-chave para filtragem por atributos.
Exemplo com Parâmetros Específicos
# Busca por tags 'div' com id específico
resultado = documento.find_all('div', id='navegacao')
print(resultado)
# Busca por links com classe usando expressão regular
import re
links_especiais = documento.find_all('a', class_=re.compile('menu-'))
print(links_especiais)
# Limite de resultados
limitado = documento.find_all('a', class_=re.compile('menu-'), limit=3)
print(limitado)
Note que class_ é usado em vez de class para evitar conflitos com palavras reservadas Python. A abreviação documento('a') é equivalente a documento.find_all('a').
Seletores CSS
O método select() permite consultas CSS, retornando uma lista. Exemplos incluem seleção por tag ('title'), classe ('.minha-classe'), id ('#meu-id'), ou combinações hierárquicas ('body > div'). Atributos são incluídos com colchetes, como 'a[href="http://exemplo.com"]'.
# Seleção por classe
elementos_classe = documento.select('.menu')
print(elementos_classe)
# Combinação de tag e id
selecao_mista = documento.select('p#importante')
print(selecao_mista)
# Obtenção de texto
for item in documento.select('.menu'):
print(item.get_text())
Detecção Automática de Codificação
Beautiful Soup pode detectar encodings automaticamente em muitos casos. Para situações específicas, a classe UnicodeDammit do módulo auxilia na identificação de codificações desconhecidas.
from bs4 import UnicodeDammit
texto_codificado = "Dados com encoding\xc3\xa0"
detecao = UnicodeDammit(texto_codificado)
print(detecao.unicode_markup) # Saída: 'Dados com encodingà'
print(detecao.original_encoding) # Exemplo: 'utf-8'