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 arvores XML e HTML

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

O padrao evoluiu em quatro grandes revisoes: XPath 1.0 (1999) — a versao ainda mais implementada; XPath 2.0 (2010) — adicionou sequencias tipadas, regex e biblioteca alinhada ao XQuery; XPath 3.0 (2014) — introduziu funcoes 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 referencia para 3.1.

Fundamentos de sintaxe: eixos, predicados e passos

Uma expressao XPath e uma sequencia de passos de localizacao 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 unica maneira de subir ou andar lateralmente na arvore.

Exemplos praticos e funcoes principais

Um punhado de expressoes 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 funcoes mais uteis do XPath 1.0 sao text(), contains(), starts-with(), normalize-space(), string-length(), count(), position() e last(). O XPath 2.0+ adiciona matches() com regex, tokenize(), replace() e aritmetica completa de data/hora.

XPath vs seletores CSS: quando cada um vence

Seletores CSS sao mais curtos, mais rapidos em navegadores e familiares ao desenvolvedor front-end. O XPath e a melhor ferramenta sempre que voce precisa de navegar para o pai (.. ou ancestor::), casar por conteudo de texto (contains(text(), 'Total')), logica posicional entre irmaos ou predicados booleanos complexos. O CSS nivel 4 esta diminuindo a distancia 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 dificil.

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 rapido), 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, alem 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 nao 0-based, entao //li[1] e o primeiro item; HTML nao e XML — marcacao invalida quebra um motor XPath 1.0 estrito, sempre passe paginas 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 facil de ler e ligeiramente mais rapido nos motores modernos. Use XPath quando precisar casar por texto visivel, subir para um pai ou filtrar irmaos por posicao — coisas que o CSS nao 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, nao o segundo. Isso pega quase todo desenvolvedor vindo de JavaScript ou Python.

Da para validar XPath offline?

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

Por que minha expressao retorna zero nos contra uma pagina HTML?

Tres suspeitos usuais: (i) a pagina usa namespaces XHTML que voce nao ligou; (ii) as tags estao em maiusculas (DIV) mas XPath 1.0 e case-sensitive; (iii) o conteudo e renderizado por JavaScript apos o load e nao estava no HTML original. Use o DOM renderizado, nao o corpo da resposta.

Qual a diferenca 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