Voltar ao blogue
Guias
Suciu DanLast updated on Apr 29, 202611 min read

XPath Web Scraping: Um guia prático com exemplos em Python

XPath Web Scraping: Um guia prático com exemplos em Python
Resumo: O XPath é uma linguagem de consulta para navegar em árvores HTML/XML por caminho, atributo ou conteúdo de texto. Este guia aborda a sintaxe, os eixos e as funções do XPath, apresentando depois exemplos práticos de scrapers em Python com lxml e Selenium. Receberá também uma ficha de referência consolidada e uma secção de resolução de problemas para os erros mais comuns do XPath.

O XPath (XML Path Language) é uma linguagem de consulta que seleciona nós de documentos XML e HTML utilizando expressões de caminho. Se os seletores CSS lhe parecem demasiado limitados para as suas tarefas de scraping, o scraping web com XPath é o próximo passo natural.

Enquanto os seletores CSS se movem apenas para a frente e para baixo através do DOM, o XPath percorre em qualquer direção: para cima até um pai, lateralmente para um irmão ou profundamente em descendentes aninhados. Também pode corresponder elementos pelo seu texto visível, uma capacidade que o CSS não possui de todo. Estas funcionalidades tornam o XPath para web scraping especialmente valioso em páginas complexas ou mal estruturadas.

Neste tutorial, irá aprender a sintaxe básica do XPath (caminhos, predicados, eixos, funções), ver como testar expressões no seu navegador e criar scrapers Python reais com lxml e Selenium. Também abordamos as armadilhas comuns que danificam os seletores XPath em produção e como evitá-las.

O que é o XPath e por que usá-lo para web scraping?

O XPath trata um documento HTML ou XML como uma árvore de nós e oferece uma sintaxe compacta para apontar exatamente para aqueles de que precisa. Pense nisso como um caminho de ficheiro: tal como /home/user/docs/file.txt navega por diretórios, /html/body/div/p percorre a árvore DOM até um parágrafo específico.

Três razões pelas quais o XPath se destaca para o scraping:

  1. Percorrido bidirecional. O XPath move-se para cima, para elementos pais ou ancestrais, e não apenas para baixo. Os seletores CSS só avançam.
  2. Seleção baseada em texto. Pode encontrar elementos pelo texto visível (por exemplo, a <a> tag com a indicação «Página seguinte»), algo que o CSS não consegue fazer.
  3. Funções integradas. contains(), starts-with(), e normalize-space() permitem-lhe lidar com marcação desorganizada sem expressões regulares.

Escrever expressões XPath sólidas é uma competência prática que compensa rapidamente em qualquer coisa além de páginas triviais. O XPath é suportado em muitas linguagens (Python, JavaScript, C#, PHP), pelo que o conhecimento da sintaxe é transferível diretamente, independentemente da sua pilha tecnológica.

Como o DOM se relaciona com as expressões XPath

O Modelo de Objetos de Documento (DOM) estrutura todos os elementos HTML, atributos e nós de texto numa árvore onde cada nó tem um pai, filhos e irmãos. Considere esta marcação:

<ul id="menu">
  <li class="active">Home</li>
  <li>About</li>
</ul>

Aqui <ul> é o pai. Os <li> elementos são os seus filhos e irmãos uns dos outros. O XPath //ul[@id='menu']/li[1] diz: encontrar qualquer <ul> com id="menu", e depois selecione o seu primeiro <li> filho. Cada consulta XPath é, em última análise, um conjunto de instruções através desta estrutura pai-filho-irmão, razão pela qual é importante compreender o DOM antes de escrever qualquer seletor.

Fundamentos da sintaxe XPath

Os caminhos XPath apresentam-se em duas variantes. Os caminhos absolutos começam na raiz (/html/body/div/p) e são precisos, mas frágeis: uma alteração estrutural quebra-os. Os caminhos relativos começam com // e pesquisam toda a árvore, tornando-os muito mais resistentes para fluxos de trabalho de web scraping com XPath.

Operador

Significado

Exemplo

/

Filho direto

/html/body/div

//

Qualquer descendente

//div[@class='price']

..

Nó pai

//span/..

@

Acesso a atributos

//a[@href]

Selecionar nós com predicados

Os predicados são filtros entre parênteses que restringem um conjunto de nós:

//ul/li[1]                  ← first <li>
//ul/li[last()]              ← last <li>
//input[@type='email']       ← by attribute
//a[text()='Next Page']      ← by exact text
//span[contains(text(),'$')] ← by partial text

Os predicados são o que torna as expressões XPath verdadeiramente poderosas para a extração de dados. Sem eles, seria necessário código de pós-processamento para filtrar correspondências indesejadas dos seus resultados.

Eixos XPath: Navegando em todas as direções

Os eixos definem a direção da percussão em relação ao nó atual e são a principal razão pela qual os seletores de web scraping do XPath conseguem alcançar elementos que o CSS simplesmente não consegue.

Eixo

Direção

Caso de uso de scraping

child::

Filhos diretos

Selecionar <li> itens dentro de um <ul>

descendant::

Todos os nós aninhados

Capturar todos os links dentro de um contêiner

parent::

Subir um nível

A partir de um preço <span>, chegar ao seu produto <div>

ancestor::

Qualquer antepassado

A partir de uma célula, encontrar <table> a que pertence

following-sibling::

Próximos irmãos

Após um <dt> rótulo, pegue o <dd> valor

preceding-sibling::

Irmãos anteriores

A partir de um elemento conhecido, procure um título

Exemplo prático para extrair uma lista de definições:

undefined//dt[text()='Price']/following-sibling::dd[1]

Isto obtém o primeiro <dd> após o <dt> que contém "Preço". O following-sibling eixo torna isto trivial, enquanto o CSS exigiria JavaScript adicional ou lógica de wrapper.

Funções XPath poderosas para extração

O HTML do mundo real é confuso. As funções XPath ajudam-no a escrever seletores que sobrevivem a classes dinâmicas, espaços em branco ocultos e valores de atributos variáveis.

contains(@class, 'product')       ← matches "product-card", "product_item"
starts-with(@id, 'listing-')      ← matches "listing-001", "listing-002"
text()                             ← targets visible text content
normalize-space()='In Stock'       ← collapses whitespace before comparing
not(contains(@class, 'ad'))        ← excludes ad containers

contains() é particularmente útil em páginas onde os frameworks acrescentam sufixos gerados aos nomes das classes. normalize-space() resolve o problema frustrante em que um seletor XPath parece correto, mas falha porque o texto está rodeado por tabulações ou novas linhas ocultas. Em conjunto, estas funções tornam as suas expressões XPath resilientes em sites reais, onde a consistência da marcação nunca é garantida.

Folha de referência rápida do XPath

Marque esta referência consolidada para consultas rápidas enquanto escreve os seus seletores XPath de scraping na Web.

Categoria

Sintaxe

O que faz

Caminho

//tag

Todas as tags correspondentes em qualquer lugar

Caminho

/parent/child

Filho direto

Caminho

..

Nó pai

Predicado

[n]

N-ésimo elemento (a partir de 1)

Predicado

[@attr='val']

Filtrar por atributo

Eixo

ancestor::tag

Qualquer antepassado

Eixo

following-sibling::tag

Próximo irmão

Função

contains()

Correspondência parcial de cadeia

Função

normalize-space()

Remover espaços em branco

Função

text()

Selecionar conteúdo de texto

Para uma abordagem mais aprofundada dos operadores e expressões compostas, a nossa ficha de referência do XPath fornece uma referência mais abrangente.

Testar o XPath nas Ferramentas de Desenvolvimento do navegador

Antes de escrever código, valide as suas expressões XPath no navegador. Abra as Ferramentas de Desenvolvimento (F12), vá para o painel Elementos e pressione Ctrl+F (Cmd+F no Mac). A barra de pesquisa aceita XPath e destaca os nós correspondentes em tempo real.

Também pode clicar com o botão direito do rato em qualquer elemento e escolher Copiar > Copiar XPath. Tenha cuidado: o navegador gera caminhos absolutos como /html/body/div[3]/section[1]/ul/li[2]/a que quebram com qualquer alteração estrutural. Reescreva sempre os caminhos gerados automaticamente em expressões relativas ancoradas em atributos estáveis (IDs, data-* atributos, nomes de classes semânticas) em vez de índices posicionais.

Web scraping com XPath em Python: passo a passo

Vamos colocar o XPath em prática com Python. As duas bibliotecas mais comuns para web scraping com XPath em Python são a lxml (HTML estático) e o Selenium (páginas renderizadas em JavaScript). Abaixo, abordamos o mesmo site com ambas para que possa comparar diretamente a ergonomia das APIs.

Usar o XPath com lxml

A lxml é uma biblioteca rápida, baseada em C e construída sobre a libxml2. Se a página não requerer JavaScript, a lxml é a escolha certa.

import requests
from lxml import html

response = requests.get("https://books.toscrape.com/")
tree = html.fromstring(response.content)
titles = tree.xpath('//article[@class="product_pod"]/h3/a/@title')
for title in titles:
    print(title)

Recuperar HTML com requests, analise com html.fromstring()e consultar com .xpath(). O resultado é uma lista Python simples. Para padrões de scraping em Python mais abrangentes, o nosso guia sobre web scraping com Python aborda em profundidade o tratamento de pedidos e o armazenamento de dados.

Usar o XPath com o Selenium

Quando as páginas apresentam conteúdo através de JavaScript, é necessário um motor de navegador. O Selenium controla um navegador sem interface gráfica e expõe o XPath através de find_elements. A partir do Selenium 4, o WebDriver está, alegadamente, incluído no pacote (verifique nas notas de lançamento atuais do Selenium antes de confiar nisto).

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://books.toscrape.com/")
elements = driver.find_elements(By.XPATH, '//article[contains(@class,"product_pod")]/h3/a')
for el in elements:
    print(el.get_attribute("title"))
driver.quit()

O XPath é quase idêntico à versão lxml. A diferença está na API: .xpath() versus find_elements(By.XPATH, ...). Para mais informações sobre fluxos de trabalho de navegadores sem interface gráfica, o nosso tutorial de scraping com Selenium e Python explica os padrões de automação. Escolha o lxml para páginas estáticas e recorra a um navegador sem interface gráfica apenas quando a execução de JavaScript for realmente necessária.

Seletores XPath vs CSS: Quando usar cada um

Critérios

XPath

Seletores CSS

Direção

Para cima, para baixo, lateralmente

Apenas para a frente

Correspondência de texto

Nativo (text(), contains())

Não suportado

Legibilidade

Verboso, mas explícito

Conciso

Desempenho

Aproximadamente igual na prática

Ligeiramente mais rápido nos benchmarks

Curva de aprendizagem

Mais acentuada

Mais fácil

Utilize CSS quando os alvos forem acessíveis apenas por classe ou ID. Utilize XPath para tarefas de scraping que necessitem de percurso de elementos pai, correspondência de texto ou navegação em múltiplos eixos. Muitos utilizadores experientes de scraping combinam ambos livremente. Para uma comparação mais aprofundada, a nossa página sobre seletores XPath vs CSS aborda casos extremos adicionais e estratégias de seleção.

Em termos de desempenho, o XPath é por vezes referido como mais lento, embora a diferença seja normalmente insignificante quando a latência da rede domina a sua carga de trabalho de scraping. A velocidade do seletor raramente se torna o gargalo em projetos reais.

Erros comuns no XPath e como corrigi-los

Caminhos gerados automaticamente frágeis. Os XPaths copiados do navegador utilizam índices absolutos. Reescreva-os para se basearem em atributos estáveis como @id ou @data-testid.

Colisões de namespace. Se o XPath não retornar nada em páginas XHTML, é provável que os prefixos de namespace estejam a interferir. Use local-name() para os contornar: //*[local-name()='div'].

Inconsistências de espaços em branco. text()='In Stock' falha quando a fonte contém novas linhas ou tabulações ocultas. Envolva a verificação em normalize-space() para comprimir os espaços em branco primeiro.

Nomes de classe dinâmicos. Frameworks como o React geram nomes de classe com hash (por exemplo, card__a3xK2). Use contains(@class, 'card') para corresponder apenas ao prefixo estável.

Teste os seus seletores XPath numa pequena amostra antes de escalar para milhares de páginas. Depurar um seletor com erros numa única página é simples; depurá-lo após a execução de um grande lote desperdiça tempo e largura de banda.

Pontos-chave

  • O XPath navega pelo HTML em qualquer direção, tornando-o mais versátil do que os seletores CSS para tarefas complexas de scraping.
  • Dê sempre preferência a caminhos relativos (//) em vez de caminhos absolutos para manter os seletores resistentes a alterações no DOM.
  • Utilize funções como contains(), normalize-space(), e text() para lidar com marcações confusas do mundo real.
  • Para HTML estático, o lxml é a opção mais rápida em Python. Reserve o Selenium para páginas que necessitem de renderização em JavaScript.
  • Teste primeiro todas as expressões XPath nas DevTools do navegador e reescreva os caminhos gerados automaticamente para usar âncoras estáveis.

Perguntas frequentes

O XPath é melhor do que os seletores CSS para web scraping?

Nenhum dos dois é universalmente melhor. O XPath destaca-se quando é necessária a percussão de elementos pai, a correspondência baseada em texto ou a filtragem complexa. Os seletores CSS são mais rápidos de escrever para seleções simples de classes ou IDs e tendem a ter um desempenho ligeiramente melhor em benchmarks sintéticos. A maioria dos scrapers de produção utiliza ambos, escolhendo aquele que se adequa a cada tarefa de seleção específica.

O XPath consegue extrair páginas renderizadas em JavaScript?

O XPath é uma linguagem de consulta, não um motor de renderização. Funciona em qualquer DOM que receba. Para extrair conteúdo renderizado em JavaScript, primeiro precisa de uma ferramenta que execute o JavaScript da página (como um navegador headless) e, em seguida, aplicar expressões XPath ao DOM resultante. Os analisadores estáticos apenas veem a resposta bruta do servidor antes de qualquer renderização do lado do cliente.

Qual é a melhor biblioteca Python para web scraping com XPath?

Para páginas estáticas, o lxml é o padrão: rápido, bem documentado e apoiado por bibliotecas C comprovadas. Para páginas dinâmicas, o Selenium oferece suporte a XPath através da sua find_elements API. O Scrapy também oferece suporte nativo a XPath através da sua classe Selector, tornando-o uma escolha sólida para pipelines de rastreamento completos.

Por que é que o XPath copiado do Chrome DevTools falha por vezes no código?

O Chrome gera caminhos absolutos com índices posicionais baseados no DOM ativo, que pode incluir elementos injetados por JavaScript ou extensões do navegador. Quando o seu analisador processa o HTML bruto (antes da execução do JS), a estrutura difere, pelo que os índices posicionais apontam para os elementos errados. Reescreva a expressão utilizando atributos estáveis em vez de posições.

Conclusão

A extração de dados da Web com XPath oferece um nível de precisão que métodos de seleção mais simples não conseguem igualar. Com a sintaxe, os eixos, as funções e os padrões Python abordados aqui, deve estar preparado para lidar com tudo, desde a seleção básica de atributos até à navegação em páginas profundamente aninhadas e com estruturas inconsistentes.

A chave para melhorar é a prática: comece com um alvo simples, teste expressões no DevTools e aumente a complexidade gradualmente. Mantenha os seletores relativos, recorra a funções para lidar com a variabilidade da marcação e valide sempre num pequeno lote antes de escalar.

Quando as proteções anti-bot, CAPTCHAs ou a gestão de proxies começarem a consumir mais tempo do que a sua lógica XPath propriamente dita, a WebScrapingAPI trata da camada de pedidos por si, gerindo a rotação de proxies e as contramedidas de bloqueio por trás de um único ponto de extremidade, para que se possa concentrar em seletores limpos e no processamento de dados.

Sobre o autor
Suciu Dan, Co-fundador @ WebScrapingAPI
Suciu DanCo-fundador

Suciu Dan é cofundador da WebScrapingAPI e escreve guias práticos, voltados para programadores, sobre web scraping em Python, web scraping em Ruby e infraestruturas de proxy.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.