Probador de XPath y JSONPath
TextoTodo se ejecuta en tu navegador: no se sube nada
Pega algo de contenido, escribe una ruta y mira qué selecciona. Los trabajos habituales: `//a/@href` para todos los enlaces, `//img/@src` para todas las URL de imágenes, `//h2` para todos los títulos —o `$.store.book[*].title` para todos los títulos de una respuesta de API, y `$..id` para todos los id a cualquier profundidad—. Por qué las dos sintaxis comparten una página: tienen la misma forma —una ruta más un documento dan una lista de resultados—. Separadas en dos herramientas, primero tendrías que decidir si lo que llevas en el portapapeles es JSON o XML, y esa decisión no sirve de nada antes de pegar nada. Elige la sintaxis arriba. Las dos son subconjuntos definidos. Lo que se admite está listado abajo, y cualquier cosa fuera de eso da un error claro de «no admitido» en vez de devolver nada, porque «la sintaxis no está implementada» y «no ha coincidido nada» se ven idénticos en pantalla, y lo primero te hace revisar un selector que nunca estuvo mal. JSONPath no tiene un estándar de facto, y conviene saberlo de antemano: `$..book[?(@.price<10)]` no devuelve lo mismo en las bibliotecas JSONPath de JavaScript, Python y Java: discrepan en los límites de los cortes y en si una búsqueda descendente incluye el propio nodo. El RFC 9535 no llegó hasta 2024. Esta herramienta sigue el RFC 9535, así que el resultado sirve para depurar en local; comprueba cómo se comporta tu biblioteca antes de pegar la expresión en el código. Por qué no se implementa XPath completo: son trece ejes, espacios de nombres, variables y una lista larga de funciones —miles de líneas—. El `document.evaluate` del navegador sería inmediato, pero obliga al algoritmo a tocar el DOM, y cada conversión de este sitio es una función pura para poder probarse en Node. Esta herramienta implementa la capa habitual sobre el analizador HTML ligero del propio sitio. El análisis perdona: el HTML pegado suele tener etiquetas sin cerrar y comillas que faltan, y nada de eso debería tumbar la consulta entera (es el mismo analizador que usa HTML a Markdown).
Funciones
- Una sola pantalla, dos sintaxis: XPath para HTML / XML, JSONPath para JSON
- Ejes de XPath: hijo `/` y descendiente `//`, los dos que necesita la extracción
- Pruebas de nodo de XPath: nombres de etiqueta, `*`, `@atributo` y `text()`, sin distinguir mayúsculas
- Predicados de XPath: `[1]`, `[last()]`, `[@a]`, `[@a="v"]`, `[contains(@a,"v")]`, `[starts-with(@a,"v")]` y más
- JSONPath: `.key`, `["key"]`, `[*]`, `..` para descendientes, `[0]` con uniones y cortes `[1:3]`
- Filtros de JSONPath: `[?(@.price < 100)]` con comparaciones `==` `!=` `<` `>`, `&&`, `||` y paréntesis
- JSONPath también puede imprimir la ubicación de cada coincidencia (ruta con `$`), lista para pegar en el código
- Cuatro salidas: texto/valor, código HTML, ubicación o solo la cantidad
- Los predicados de posición siguen la semántica real de XPath: `//a[1]` es el primer `a` bajo cada padre
- Cada resultado lleva un índice desde 1 y se copia por separado; los objetos se copian con el JSON embellecido
- Una frase cuando no coincide nada, en vez de un panel vacío
- La sintaxis no admitida da error, así que nunca se confunde con una coincidencia vacía
- El HTML mal formado también se analiza: una etiqueta sin cerrar no tumba la consulta
Cómo se usa
- Elige la sintaxis: XPath (HTML / XML) o JSONPath (JSON)
- Pega el código o el JSON y escribe una expresión, como //a/@href o $.store.book[*].title
- Elige la salida: texto/valor, código HTML, ubicación o solo la cantidad
- El resultado se actualiza al escribir; copia una fila con su botón
Preguntas frecuentes
- ¿Qué sintaxis de XPath se admite?
- Los ejes son hijo `/` y descendiente `//`; las pruebas de nodo son nombres de etiqueta, `*`, `@atributo` y `text()`; los predicados son `[1]`, `[last()]`, `[@a]`, `[@a="v"]`, `[text()="v"]`, `[contains(@a,"v")]`, `[starts-with(@a,"v")]` y dos unidos con `and`; y la única función es un `count(...)` por fuera. Cualquier cosa fuera de eso da «no admitido», por ejemplo `position()>1`, comparaciones `!=`, ejes como `ancestor::` y espacios de nombres. Se da error en vez de devolver nada porque ambas cosas se ven igual en pantalla, y el caso vacío te enviaría a buscar un fallo en un selector que estaba bien.
- ¿Por qué `//a[1]` selecciona varios elementos?
- Porque selecciona el primer `a` bajo cada padre, no el primer `a` del documento: eso es lo que especifica XPath (`//a` significa «los hijos `a` de cualquier nodo», y un predicado de posición se aplica dentro de cada grupo por separado). Para la primera coincidencia del documento se escribiría `(//a)[1]`, que esta herramienta no admite; toma la primera fila del resultado. Es la parte de XPath que más se malinterpreta, y por eso se conserva la semántica estándar en vez de «arreglarla» por comodidad.
- ¿Por qué mi extracción de enlaces salió vacía?
- Comprueba tres cosas: si el nombre del atributo es correcto (`href`, no `link`); si el enlace está en otro atributo (algunos sitios usan `data-href` u `onclick`); y si el contenido lo genera un script: esta herramienta analiza el código que pegaste, así que si ese código salió de «ver código fuente» en una página renderizada con JavaScript, los elementos nunca estuvieron ahí. Copia el HTML ya renderizado desde el panel Elements. La herramienta nunca pide la URL, y es a propósito.
- ¿Qué sintaxis de JSONPath se admite?
- La raíz `$` (opcional), el acceso a hijos `.key` y `['key']`, los comodines `[*]` y `.*`, la búsqueda en descendientes `..`, los índices y uniones `[0]` y `[0,2]`, los cortes `[1:3]` y las expresiones de filtro `[?(@.price < 100)]` con comprobación de existencia, comparaciones `==` `!=` `<` `<=` `>` `>=`, `&&`, `||`, paréntesis y negación `!`. Cualquier otra cosa da error: extensiones de función (`length()`, `count()`, `match()`, `search()`, `value()`), expresiones regulares y rutas absolutas con `$` dentro de un filtro.
- ¿Por qué mi JSONPath se diferencia del que da la biblioteca de mi código?
- Porque JSONPath todavía no tiene un único estándar. El RFC 9535 no llegó hasta 2024 y, antes, las bibliotecas `jsonpath` de JavaScript, `jsonpath-ng` de Python y Jayway de Java iban cada una por su lado, sin coincidir en tres puntos: los límites de los cortes (¿`:3` incluye el tercer elemento?), si la búsqueda en descendientes incluye el propio nodo (¿puede `$..a` seleccionar el `a` de arriba del todo?) y si los filtros comparan entre tipos (`@.price < "10"` comparando una cadena con un número). Aquí se sigue el RFC 9535 en todo: los cortes son abiertos por la derecha, la búsqueda en descendientes incluye el propio nodo y las comparaciones entre tipos son falsas. Así que úsala para confirmar que una ruta está bien mientras depuras en local y luego verifícala con datos reales en tu biblioteca antes de publicarla.
- ¿Para qué sirve la salida «ubicación»?
- Imprime, para cada coincidencia, su ruta dentro del documento, como `$.store.book[2].title`. Lo habitual suele ser al revés: ves qué aspecto tiene un valor pero necesitas su posición en la estructura para fijar una ruta hacia él. Los valores por sí solos solo te dicen que hay resultados; las ubicaciones te dicen dónde están. Ojo: una clave con caracteres especiales se escribe `['a.b']`, que es lo que la mantiene distinta de `.a.b`.
Herramientas relacionadas
Formateador HTML
FormatoFormatea HTML en línea por niveles de etiqueta, manteniendo el texto y las etiquetas en línea en la misma línea y el contenido de script o pre intacto.
Formateador JSON
FormatoFormatea, valida y repara JSON en línea: árbol plegable, búsqueda de claves y valores, edición nodo a nodo y errores con línea y columna.
HTML a Markdown
TextoConvierte HTML a Markdown: títulos, listas, tablas, enlaces, imágenes y bloques de código al estilo de GitHub, escapando los caracteres de sintaxis.
Probador de regex
TextoPrueba expresiones regulares en el navegador: resaltado en vivo, grupos de captura, vista previa de sustitución y código para cinco lenguajes.
Comparar texto
TextoCompara dos textos línea a línea y resalta las líneas añadidas, borradas y sin cambios, alineando cada edición por diferencia mínima. Todo local.
Contador de palabras
Texto¿Cuánto mide este texto? Cuenta por separado caracteres chinos y palabras inglesas, con caracteres, líneas, bytes UTF-8, tiempo de lectura y SMS.