> For the complete documentation index, see [llms.txt](https://developers.oxylabs.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers.oxylabs.io/products/es/web-scraper-api/features/custom-parser/writing-instructions-manually/parsing-instruction-examples.md).

# Ejemplos de instrucciones de análisis

El siguiente fragmento HTML se analiza usando instrucciones de análisis de ejemplo en las secciones siguientes.

### HTML de ejemplo <a href="#sample-html" id="sample-html"></a>

```html
<body>
    <div id="products">
        <div class="product" id="shoes">
            <div class="title">Shoes</div>
            <div class="price">223.12</div>
            <div class="description">
                <ul>
                    <li class="description-item">Super</li>
                </ul>
            </div>
        </div>
        <div class="product" id="pants">
            <div class="title">Pants</div>
            <div class="price">60.12</div>
            <div class="description">
                <ul>
                    <li class="description-item">Amazing</li>
                    <li class="description-item">Quality</li>
                </ul>
            </div>
        </div>
        <div class="product" id="socks">
            <div class="title">Socks</div>
            <div class="price">123.12</div>
            <div class="description">
                <ul>
                    <li class="description-item">Very</li>
                    <li class="description-item">Nice</li>
                    <li class="description-item">Socks</li>
                </ul>
            </div>
        </div>
    </div>
</body>
```

### Mínimo indispensable <a href="#bare-minimum" id="bare-minimum"></a>

{% hint style="info" %}
Caso de uso: quieres extraer el texto de todos los **zapatos** **descripción** **elementos**.
{% endhint %}

*Ejemplo 1. Selección de elementos de descripción de zapatos usando XPath.*

```json
{
    "shoes_description": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [
                    ".//div[@id='shoes']//li[@class='description-item']/text()"
                ]
            }
        ]
    }
}
```

La `xpath` la función encontrará un solo elemento y lo pondrá en una lista como una cadena:

```json
{
    "shoes_description": [
        "Super"
    ]
}
```

El comportamiento exacto `xpath` de la función se describe [**aquí**](/products/es/web-scraper-api/features/custom-parser/writing-instructions-manually/list-of-functions.md).

### Instrucciones de análisis anidadas <a href="#nested-parsing-instructions" id="nested-parsing-instructions"></a>

{% hint style="info" %}
Caso de uso: quieres analizar toda la información relacionada con los zapatos. Además, el resultado analizado debe representar la estructura del documento del HTML proporcionado.
{% endhint %}

Estás apuntando a esta parte del HTML de ejemplo:

```html
<div class="product" id="shoes">
    <div class="title">Shoes</div>
    <div class="price">223.12</div>
    <div class="description">
        <ul>
            <li class="description-item">Super</li>
        </ul>
    </div>
</div>
```

Y te gustaría que el resultado analizado tuviera la siguiente estructura:

```json
{
    "shoes": {
        "title": "Shoes",
        "price": "223.12",
        "description": [
            "Super"
        ]
    }
}
```

Las instrucciones de análisis se verían así.

*Ejemplo 2. Las instrucciones de análisis se usan para analizar* `zapatos` *información.*

```json
{
    "shoes": {
        "title": {
            "_fns": [
                {
                    "_fn": "xpath_one",
                    "_args": ["//div[@id='shoes']/div[@class='title']/text()"]
                }
            ]
        },
        "price": {
            "_fns": [
                {
                    "_fn": "xpath_one",
                    "_args": ["//div[@id='shoes']/div[@class='price']/text()"]
                }
            ]
        },
        "description": {
            "_fns": [
                {
                    "_fn": "xpath",
                    "_args": ["//div[@id='shoes']//li[@class='description-item']/text()"]
                }
            ]
        }
    }
}
```

`xpath_one` funciona de manera similar a `xpath`, pero en lugar de devolver una lista de todas las coincidencias,  **devuelve el primer elemento coincidente**.

En el ejemplo anterior, la `zapatos` propiedad es la única propiedad definida en el ámbito de instrucciones más externo. La `zapatos` propiedad contiene instrucciones de análisis anidadas.

La `zapatos` el ámbito de instrucciones no tiene un pipeline definido (`_fns` la propiedad falta). Esto significa que los pipelines definidos en `title`, `precio`, y `descripción` los ámbitos usarán el documento que se está analizando como entrada del pipeline.

En el Ejemplo 2, puedes ver una repetición de `//div[@id='shoes']` en las expresiones XPath. La repetición se puede evitar definiendo un pipeline en `zapatos` ámbito:

*Ejemplo 3. Definir un pipeline en* `zapatos` *instrucciones de ámbito para evitar la repetición de la expresión XPath.*

```json
{
    "shoes": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": ["//div[@id='shoes']"]
            }
        ],
        "title": {
            "_fns": [
                {
                    "_fn": "xpath_one",
                    "_args": ["./div[@class='title']/text()"]
                }
            ]
        },
        "price": {
            "_fns": [
                {
                    "_fn": "xpath_one",
                    "_args": ["./div[@class='price']/text()"]
                }
            ]
        },
        "description": {
            "_fns": [
                {
                    "_fn": "xpath",
                    "_args": [".//li[@class='description-item']/text()"]
                }
            ]
        }
    }
}
```

Al usar las instrucciones de análisis proporcionadas en el Ejemplo 3, Custom Parser hará lo siguiente:

1. Comenzará procesando `shoes._fns` pipeline, que generará el `zapatos` elemento HTML;
2. Tomará `shoes._fns` la salida del pipeline y la usará como entrada para los pipelines definidos en `title`, `precio`, y `descripción` ámbitos;
3. Procesará `title`, `precio`, y `descripción` los pipelines para producir los valores finales.

El resultado se verá igual que el resultado del Ejemplo 2:

```json
{
    "shoes": {
        "title": "Shoes",
        "price": "223.12",
        "description": [
            "Super"
        ]
    }
}
```

La principal diferencia entre el Ejemplo 2 y el Ejemplo 3 es que, en el Ejemplo 3, el pipeline está definido en el `zapatos` ámbito. **Este pipeline adicional selecciona el elemento de los zapatos y lo pasa a otros pipelines que se encuentran más profundos en la jerarquía de instrucciones.**

### Lista de objetos anidados <a href="#list-of-nested-objects" id="list-of-nested-objects"></a>

{% hint style="info" %}
**Caso de uso:** Anteriormente, querías analizar solo `zapatos` la información. Ahora quieres analizar la información de todos los productos en el HTML.
{% endhint %}

La [**HTML de ejemplo**](#sample-html) se usa de nuevo como el documento que se está analizando.

Si quieres que tu resultado analizado se vea así:

```json
{
    "products": [
        {
            "title": "Shoes",
            "price": "223.12",
            "description": [
                "Super"
            ]
        },
        {
            "title": "Pants",
            "price": "60.12",
            "description": [
                "Amazing",
                "Quality"
            ]
        },
        {
            "title": "Socks",
            "price": "123.12",
            "description": [
                "Very",
                "Nice",
                "Socks"
            ]
        }
    ]
}
```

Las instrucciones de análisis se verían así:

*Ejemplo 4. Analizando todos los productos encontrados en el documento HTML.*

```json
{
    "products": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": ["//div[@class='product']"]
            }
        ],
        "_items": {
            "title": {
                "_fns": [
                    {
                        "_fn": "xpath_one",
                        "_args": ["./div[@class='title']/text()"]
                    }
                ]
            },
            "price": {
                "_fns": [
                    {
                        "_fn": "xpath_one",
                        "_args": ["./div[@class='price']/text()"]
                    }
                ]
            },
            "description": {
                "_fns": [
                    {
                        "_fn": "xpath",
                        "_args": [".//li[@class='description-item']/text()"]
                    }
                ]
            }
        }
    }
}
```

La estructura de las instrucciones de análisis se parece a la del Ejemplo 3. Sin embargo, hay dos excepciones principales:

1. `xpath` se usa en lugar de `xpath_one` en `products._fns` pipeline. `products._fns` El pipeline ahora generará una lista de todos los elementos que coincidan con la expresión XPath proporcionada (una lista de elementos de producto).
2. `_items` La propiedad reservada se usa para indicar que quieres formar una lista iterando por cada elemento de la `products._fns` salida del pipeline y **pasando/procesando cada elemento de la lista por separado** dentro del ámbito del pipeline.

Si `_items` no se hubiera usado la propiedad reservada en las instrucciones de análisis del Ejemplo 4, el resultado analizado se vería así:

```json
{
    "products": {
        "title": [
            "Shoes",
            "Pants",
            "Socks"
        ],
        "price": [
            "223.12",
            "60.12",
            "123.12"
        ],
        "description": [
            [
                "Super"
            ],
            [
                "Amazing",
                "Quality"
            ],
            [
                "Very",
                "Nice",
                "Socks"
            ]
        ]
    }
}
```

{% hint style="warning" %}
`_items` se usa para especificar que Custom Parser debe pasar ***elementos de la lista por separado*** en lugar de la ***lista completa*** a las instrucciones de análisis.
{% endhint %}

### Selecciona el elemento N-ésimo de una lista <a href="#select-n-th-element-from-a-list" id="select-n-th-element-from-a-list"></a>

Esta sección demuestra la flexibilidad de los pipelines. El mismo problema se puede abordar de diferentes maneras.

Se pueden usar varias opciones para seleccionar el elemento N-ésimo de una lista de cualquier valor.

{% hint style="info" %}
**Caso de uso:** quieres seleccionar el precio del segundo producto de la página.
{% endhint %}

La [**HTML de ejemplo**](#sample-html) se usa de nuevo como ejemplo. Tienes varias opciones para seleccionar el segundo producto.

#### Opción 1 <a href="#option-1" id="option-1"></a>

Puedes utilizar el selector XPath `[]` y definir la selección en la expresión XPath.

*Ejemplo 5. Selecciona el segundo precio usando el selector XPath \[].*

```json
{
    "second_price": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [
                    "(//div[@class='price'])[2]/text()"
                ]
            }
        ]
    }
}
```

Resultado:

```json
{
    "second_price": [
        "60.12"
    ]
}
```

#### Opción 2 <a href="#option-2" id="option-2"></a>

También puedes usar la `xpath` función para encontrar todos los precios y canalizarlo a la función `select_nth`, que selecciona el elemento n-ésimo de la lista extraída de precios.

*Ejemplo 6. Selecciona el segundo valor usando la función \`select\_nth\`.*

```json
{
    "second_price": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [
                    "//div[@class='price']/text()"
                ]
            },
            {
                "_fn": "select_nth",
                "_args": 1
            }
        ]
    }
}
```

Resultado:

```json
{
    "second_price": "60.12"
}
```

{% hint style="warning" %}
Fíjate en cómo la `select_nth` función devuelve un elemento de una lista mientras que la `xpath` función devuelve una lista de elementos, incluso si se encuentra un solo elemento.
{% endhint %}

#### Opción 3 <a href="#option-3" id="option-3"></a>

Puedes usar `select_nth` con cualquier tipo de lista, incluidas listas de elementos HTML:

*Ejemplo 7. Selección de todos los elementos HTML de producto con* `class="product"` *==> seleccionando el segundo elemento de producto de la lista ==> extrayendo el texto del precio del elemento HTML de producto seleccionado*.

```json
{
    "second_price": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": ["//div[@class='product']"]
            },
            {
                "_fn": "select_nth",
                "_args": 1
            },
            {
                "_fn": "xpath",
                "_args": ["./div[@class='price']/text()"]
            }
        ]
    }
}
```

Resultado:

```json
{
    "second_price": ["60.12"]
}
```

### Gestión de errores <a href="#error-handling" id="error-handling"></a>

Dado el siguiente fragmento HTML:

```html
<div class="product" id="shoes">
    <div class="title">Nice Shoes</div>
    <div class="price">223.12</div>
    <div class="description">Super</div>
</div>
```

Y tratando de analizarlo con las siguientes instrucciones de análisis:

```json
{
    "product": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": ["//div[@id='shoes']"]
            }
        ],
        "price": {
            "_fns": [
                {
                    "_fn": "xpath_one",
                    "_args": ["//div[@class='price']/text()"]
                }
            ]
        },
        "title": {
            "_fns": [
                {
                    "_fn": "xpath_one",
                    "_args": ["//div[@class='title']/text()"]
                }
            ]
        },
        "description": {
            "_fns": [
                {
                    "_fn": "xpath_one",
                    "_args": ["//div[@class='description']/text()"]
                },
                {
                    "_fn": "convert_to_float"
                }
            ]
        }
    }
}
```

Custom Parser devolverá un resultado analizado en el que `precio` y `title` se analizaron normalmente, pero el `descripción` no se pudo analizar debido a la `convert_to_float` falla de la función al convertir `cadena` a `decimal`:

```json
{
    "product": {
        "price": "223.12",
        "title": "Shoes",
        "description": null
    },
    "_warnings": [
        {
            "_fn": "convert_to_float",
            "_fn_idx": 1,
            "_msg": "Failed to process function.",
            "_path": ".product.description"
        }
    ]
}
```

De forma predeterminada, todos los errores se cuentan como advertencias y se colocan dentro de la `_warnings` lista. Si quieres ignorar los errores al analizar un campo, puedes suprimir las advertencias/errores con `"_on_error": "suppress"` parámetro:

```json
{
    "product": {
        ...,
        "description": {
            "_on_error": "suppress",
            "_fns": [
                {
                    "_fn": "xpath_one",
                    "_args": ["//div[@class='description']/text()"]
                },
                {
                    "_fn": "convert_to_float"
                }
            ]
        }
    }
}
```

Lo que producirá el siguiente resultado:

```json
{
    "product": {
        "price": "223.12",
        "title": "Shoes",
        "description": null
    }
}
```

### Arreglo de arreglos <a href="#array-of-arrays" id="array-of-arrays"></a>

Custom Parser permite arreglos N-dimensionales en los resultados analizados. Como ejemplo, usemos el siguiente fragmento HTML:

```html
<div class="row">
    <div class="column">1</div>
    <div class="column">2</div>
    <div class="column">3</div>
</div>
<div class="row">
    <div class="column">4</div>
    <div class="column">5</div>
    <div class="column">6</div>
</div>
<div class="row">
    <div class="column">7</div>
    <div class="column">8</div>
    <div class="column">9</div>
</div>
```

Supongamos que quieres analizar el documento para que el resultado sea un arreglo bidimensional 3x3 de enteros:

```json
{
    "table": [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
    ]
}
```

Para analizar el HTML en el JSON anterior, puedes usar las siguientes instrucciones de análisis:

```json
{
    "table": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": ["//div[@class='row']"]
            },
            {
                "_fn": "xpath",
                "_args": [".//div[@class='column']/text()"]
            },
            {
                "_fn": "convert_to_int"
            }
        ]
    }
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://developers.oxylabs.io/products/es/web-scraper-api/features/custom-parser/writing-instructions-manually/parsing-instruction-examples.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
