Consejos para escribir expresiones XPath
Aprende a escribir expresiones XPath efectivas para Custom Parser con técnicas probadas y mejores prácticas que aseguran una extracción de datos precisa.
La estructura HTML puede diferir entre el documento extraído y el cargado en el navegador
Al escribir funciones de selección de elementos HTML, asegúrate de trabajar con documentos extraídos en lugar de la versión en vivo del sitio web cargada en tu navegador, ya que los documentos pueden diferir. La razón principal detrás de este problema es el renderizado de JavaScript. Cuando se abre un sitio web, tu navegador es responsable de cargar documentos adicionales, como hojas de estilo CSS y scripts de JavaScript, que pueden cambiar la estructura del documento HTML inicial. Al analizar HTMLs extraídos, Custom Parser no carga el documento HTML de la misma manera que lo hacen los navegadores (los analizadores ignoran las instrucciones de JavaScript), por lo tanto, el árbol HTML puede diferir entre lo que el analizador y el navegador renderizan.
Como ejemplo, observa el siguiente documento HTML:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>
<h3>This is a product</h3>
<div id="price-container">
<p>This is the price:</p>
</div>
<p>And here is some description</p>
</div>
<script>
const priceContainer = document.querySelector("#price-container");
const priceElement = document.createElement("p");
priceElement.textContent = "123";
priceElement.id = "price"
priceContainer.insertAdjacentElement("beforeend", priceElement);
</script>
</body>
</html>Si abres el documento mediante el navegador, mostrará el precio que puedes seleccionar usando la siguiente expresión XPath //p[@id="price"]:

Ahora, si deshabilitas el renderizado de JavaScript en el navegador, el sitio web se renderizará de la siguiente manera:

La misma //p[@id="price"] La expresión XPath ya no coincide con el precio ya que no está renderizado.
Asegúrate de escribir todos los posibles selectores HTML para el elemento objetivo
Por varias razones, la misma página extraída dos veces puede tener diseños diferentes (diferentes User-Agent usados al extraer, el sitio objetivo realizando pruebas A/B, etc.).
Para abordar este problema, sugerimos definir parsing_instructions para el documento extraído inicialmente y probar estas instrucciones de inmediato con múltiples otros resultados de trabajos extraídos del mismo tipo de página.
Funciones de selector HTML (xpath/xpath_one) admiten selectores de reserva.
Flujo sugerido para escribir selectores HTML
Extrae el documento HTML de la página objetivo usando Scraper API.
Deshabilita JavaScript y abre el HTML extraído localmente en tu navegador. Si JavaScript está deshabilitado después de que se abra el HTML, asegúrate de recargar la página para que el HTML pueda recargarse sin JavaScript.

Cómo escribir instrucciones de análisis
Supongamos que tienes la siguiente página para analizar:

Analizar el título del producto
Crea un nuevo objeto JSON y asígnale un nuevo campo.
Puedes nombrar el campo como prefieras con algunas excepciones (el nombre de campo definido por el usuario no puede comenzar con un guion bajo _ , p. ej., "_title").
El nombre del campo se mostrará en el resultado analizado.
El nuevo campo debe contener un valor de tipo objeto JSON:
Si proporcionas estas instrucciones a Custom Parser, no hará nada o enviará una queja de que no has proporcionado ninguna instrucción.
Para realmente analizar el título en el campo title debés definir una canalización de procesamiento de datos dentro del objeto title usando la propiedad reservada _fns (que siempre es de tipo array):
Para que Custom Parser seleccione el texto del título, puedes utilizar la función de selector HTML xpath_one. Para usar la función en el documento HTML, debe agregarse a la canalización de procesamiento de datos. La función se define como un objeto JSON con _fn (nombre de la función) y _args (argumentos de la función) obligatorios. Consulta la lista completa de definiciones de funciones aquí.
Las instrucciones de análisis anteriores deberían producir el siguiente resultado:
Analizar la descripción
De manera similar, en las instrucciones de análisis, puedes definir otro campo donde se analizarán el contenedor de la descripción del producto, el título de la descripción y los ítems. Para que el título y los ítems de la descripción estén anidados bajo el objeto description la estructura de las instrucciones debe ser la siguiente:
La estructura dada de las instrucciones de análisis implica que description.title y description.items se analizarán basándose en el description elemento. Puedes definir una canalización para el campo description En este caso, se hace primero ya que simplificará la expresión XPath del título de la descripción.
En el ejemplo, la canalización description._fns seleccionará el elemento HTML description-container que se utilizará como punto de referencia para analizar el título y los ítems de la descripción.
Para analizar los campos restantes de la descripción, agrega dos canalizaciones diferentes para los campos description.items, y description.title:
Observa cómo la xpath se usa la función en lugar de xpath_one para extraer todos los elementos que coinciden con la expresión XPath.
Las instrucciones de análisis producen el siguiente resultado:
Analizar variantes de producto
El siguiente ejemplo muestra la estructura de instrucciones si deseas analizar información en el campo product_variants que contendrá una lista de objetos de variantes. En este caso, el objeto variante tiene los campos precio y color y precio.
Comienza seleccionando todos los elementos de variantes de producto:
Para hacer de product_variants una lista que contenga objetos JSON, tendrás que iterar a través de las variantes encontradas usando _items iterator:
Por último, define instrucciones sobre cómo analizar los campos color y precio y:
Con product_variants descrito, las instrucciones finales se verán de la siguiente manera:
Lo cual producirá la siguiente salida:
Puedes encontrar más ejemplos de instrucciones de análisis aquí: Ejemplos de instrucciones de análisis.
Última actualización
¿Te fue útil?

