1001Ferramentas
🧭Validadores

Validador de XPath

Verifica se uma expressão XPath é sintaticamente válida em um documento HTML colado. Conta quantos nós casam.

XPath: a linguagem de consulta do W3C para árvores XML e HTML

O XPath (XML Path Language) e uma linguagem de expressão padronizada pelo W3C para selecionar nos em uma árvore XML. Como todo HTML bem formado e exposto pelos navegadores como uma árvore DOM, o XPath tornou-se a língua franca de web scraping, transformacoes XSLT, automacao de testes Selenium/Cypress e processamento de dados em XQuery.

O padrão evoluiu em quatro grandes revisoes: XPath 1.0 (1999) — a versão ainda mais implementada; XPath 2.0 (2010) — adicionou sequências tipadas, regex e biblioteca alinhada ao XQuery; XPath 3.0 (2014) — introduziu funções de ordem superior e melhor tratamento de erro; e XPath 3.1 (2017) — incluiu maps, arrays e suporte a JSON. Navegadores (document.evaluate()) e a maior parte das libs de scraping ficaram em 1.0; o Saxon-HE/EE na JVM e o motor de referência para 3.1.

Fundamentos de sintaxe: eixos, predicados e passos

Uma expressão XPath e uma sequência de passos de localização separados por /. Cada passo tem o formato eixo::teste-de-no[predicado]:

  • /root/child — caminho absoluto a partir da raiz do documento.
  • //descendant — combina o no em qualquer profundidade abaixo do contexto.
  • * — coringa para qualquer elemento; @attr seleciona um atributo.
  • [predicado] — filtro booleano ou posicional aplicado ao conjunto de nos.
  • . e .. — no atual e no pai, respectivamente.

Existem 13 eixos em XPath 1.0, incluindo parent, child, descendant, ancestor, following-sibling, preceding-sibling, self e attribute. A maioria dos motores aceita as formas abreviadas (/, //, @), mas a forma extensa e as vezes a única maneira de subir ou andar lateralmente na árvore.

Exemplos praticos e funções principais

Um punhado de expressões cobre 90% do scraping de mundo real:

//div[@class='card']                  // todo <div class="card">
//a[contains(@href, 'github')]        // links que apontam para o GitHub
//input[@type='text'][1]              // primeiro input de texto
//tr[td[normalize-space()='Total']]   // linhas cuja celula tem texto "Total"
//*[@id='main']//p[position() < 4]    // tres primeiros paragrafos em #main
count(//li)                           // quantidade de itens de lista

As funções mais úteis do XPath 1.0 são text(), contains(), starts-with(), normalize-space(), string-length(), count(), position() e last(). O XPath 2.0+ adiciona matches() com regex, tokenize(), replace() e aritmética completa de data/hora.

XPath vs seletores CSS: quando cada um vence

Seletores CSS são mais curtos, mais rapidos em navegadores e familiares ao desenvolvedor front-end. O XPath e a melhor ferramenta sempre que você precisa de navegar para o pai (.. ou ancestor::), casar por conteúdo de texto (contains(text(), 'Total')), lógica posicional entre irmaos ou predicados booleanos complexos. O CSS nível 4 esta diminuindo a distância com :has() e :is(), mas o XPath continua estritamente mais expressivo. A maioria dos projetos Selenium mistura os dois: CSS para o simples, XPath para o difícil.

Ferramentas: navegadores, libs de scraping e editores

  • DevTools de Chrome / Firefox: digite $x("//a") no Console para avaliar XPath contra o DOM ao vivo.
  • Python: lxml (bindings da libxml2 — o mais rápido), parsel (usado pelo Scrapy) e BeautifulSoup com backend lxml.
  • Node.js: pacote npm xpath sobre xmldom e o page.locator("xpath=...") do Playwright.
  • JVM: Saxon-HE (gratuito) e Saxon-EE para XPath 3.1 completo, além do javax.xml.xpath embutido para 1.0.
  • Selenium: By.XPATH em todas as linguagens (Python, Java, C#, Ruby, JS).
  • Playgrounds online: xpath.in, freeformatter.com/xpath-tester e o sandbox do tutorial XML do W3C.

Pegadinhas comuns e notas de performance

O XPath tem alguns detalhes que pegam os iniciantes: a indexacao e 1-based e não 0-based, então //li[1] e o primeiro item; HTML não e XML — marcacao invalida quebra um motor XPath 1.0 estrito, sempre passe páginas raspadas por um parser HTML-aware como html.fromstring do lxml ou o jsoup; namespaces precisam ser ligados explicitamente (use um contexto de namespace em Java, o dict namespaces no lxml); o atalho // e caro em documentos grandes porque percorre todo descendente, prefira caminhos ancorados quando performance importa. Para XML muito grande, os motores em C (libxml2, Joost do Saxon) superam parsers puros em Java/JS por 5–20x.

FAQ

Devo usar CSS ou XPath no Selenium?

CSS e mais fácil de ler e ligeiramente mais rápido nos motores modernos. Use XPath quando precisar casar por texto visível, subir para um pai ou filtrar irmaos por posição — coisas que o CSS não expressa nem com :has().

A indexacao XPath e 0-based ou 1-based?

O XPath usa indexacao 1-based. //li[1] e o primeiro item, não o segundo. Isso pega quase todo desenvolvedor vindo de JavaScript ou Python.

Da para validar XPath offline?

Sim. Qualquer motor XPath conforme compila a expressão sintaticamente sem rede. Esta ferramenta roda inteiramente no seu navegador via document.evaluate() — nada e enviado para o servidor.

Por que minha expressão retorna zero nos contra uma página HTML?

Três suspeitos usuais: (i) a página usa namespaces XHTML que você não ligou; (ii) as tags estão em maiúsculas (DIV) mas XPath 1.0 e case-sensitive; (iii) o conteúdo e renderizado por JavaScript após o load e não estava no HTML original. Use o DOM renderizado, não o corpo da resposta.

Qual a diferença entre / e //?

/ seleciona um filho direto, // qualquer descendente em qualquer profundidade. /html/body/div casa apenas divs no topo do body; //div casa todo div do documento, mas a custo de CPU maior.

Ferramentas Relacionadas