Guia Prático de XPath e Processamento de HTML com a Biblioteca lxml

O XPath (XML Path Language) é uma linguagem de consulta projetada para navegar em documentos XML e HTML, permitindo localizar e extrair elementos, atributos e conteúdos de texto com alta precisão.

Fundamentos da Sintaxe XPath

O XPath trata documentos como uma árvore de nós. A navegação é realizada através de caminhos que descrevem a hierarquia do documento.

  • nodename: Seleciona todos os nós filhos do nó especificado.
  • /: Inicia a seleção a partir da raiz ou seleciona nós filhos imediatos.
  • //: Busca nós em qualquer nível do documento (descendentes), ignorando a hierarquia direta.
  • @: Utilizado para acessar atributos de um elemento.
  • .: Refere-se ao nó atual.
  • ..: Seleciona o nó pai do elemento atual.

Filtragem com Predicados

Os predicados, definidos entre colchetes [], filtram a seleção com base em critérios específicos:

  • //item[1]: Seleciona o primeiro elemento item.
  • //item[last()]: Seleciona o último elemento item.
  • //item[@id='target']: Seleciona elementos com um atributo id específico.
  • //item[price > 50]: Filtra elementos cujo valor numérico interno supera 50.

Funções e Operadores Úteis

  • contains(@atributo, 'valor'): Verifica se um atributo contém determinada substring.
  • text(): Extrai o conteúdo textual de um nó.
  • |: Operador de união para selecionar múltiplos caminhos simultaneamente (ex: //h1 | //h2).

Manipulação com lxml

A biblioteca lxml é uma das ferramentsa mais eficientes em Python para parseamento de documentos HTML/XML. Ela é capaz de corrigir automaticamente estruturas de marcação malformadas.

Exemplo de Implementação

from lxml import etree

html_content = """
<ul class="products">
   <li class="item"><a href="/prod/1">Notebook</a></li>
   <li class="item"><a href="/prod/2">Smartphone</a></li>
</ul>
"""

# Converter string para objeto analisável
parser = etree.HTML(html_content)

# Extração usando XPath
links = parser.xpath('//li[@class="item"]/a/@href')
names = parser.xpath('//li[@class="item"]/a/text()')

for link, name in zip(links, names):
   print(f"Produto: {name} | Link: {link}")

Para processar arquivos externos diretametne, utiliza-se a função etree.parse():

# Carregando um arquivo local
doc = etree.parse('documento.html')
resultados = doc.xpath('//div[contains(@class, "container")]//span/text()')
print(resultados)

A utilização do etree.tostring() é recomendada durante a depuração para visualizar como o lxml reconstruiu ou estruturou o HTML após a leitura, garantindo que o XPath aplicado corresponda ao modelo de árvore real processado pelo interpretador.

Tags: Python xpath lxml web-scraping data-extraction

Publicado em 6-7 19:09 por Thomas