# Ejemplos de funciones de análisis

## Procesamiento de HTML

### `element_text`

#### HTML de ejemplo

```html
<!DOCTYPE html>
<html>
<body>
    <div id="product">
        <div id="product-description">Este es un producto bonito</div>
        <div id="product-price">    12  3


        </div>
    </div>
</body>
</html>
```

**Extraer texto del elemento HTML y eliminar espacios en blanco**

```json
{
    "price": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": [".//*[@id='product-price']"]
            },
            {
                "_fn": "element_text"
            }
        ]
    }
}
```

```json
{
    "price": "12  3"
}
```

**Dado un valor de cadena como entrada, no hacer nada**

```json
{
    "price": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": [".//*[@id='product-price']/text()"]
            },
            {
                "_fn": "element_text"
            }
        ]
    }
}
```

```json
{
    "price": "    12  3\n\n\n        "
}
```

### `xpath`

#### HTML de ejemplo

```html
<body>
    <div class="product" id="socks">
        <div class="title">Calcetines</div>
        <div class="price">123.12</div>
        <div class="description">
            <ul>
                <li class="description-item">Muy</li>
                <li class="description-item">Bonitos</li>
                <li class="description-item">Calcetines</li>
            </ul>
        </div>
    </div>
</body>
```

**Obtener todos los elementos de la descripción**

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

```json
{
    "description_items": ["Muy", "Bonitos", "Calcetines"]
}
```

**Obtener el primer elemento de la descripción**

```json
{
    "first_description_item": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": ["(//li[@class='description-item'])[1]/text()"]
            }
        ]
    }
}
```

```json
{
    "first_description_item": [
        "Muy"
    ]
}
```

**Comprobar si existe el elemento de la sección de descripción**

```json
{
    "description_section_exists": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": ["boolean(//div[@class='description'])"]
            }
        ]
    }
}
```

```json
{
    "description_section_exists": true
}
```

**Obtener el precio como número**

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

```json
{
    "description_section_exists": 123.12
}
```

**Múltiples expresiones a las que recurrir en caso de que falle la expresión anterior**

```json
{
    "price": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [
                    "//div[@class='product-price']/text()", <--- esto no encuentra nada
                    "//div[@class='price']/text()" <--- esto encuentra el precio objetivo
                ]
            }
        ]
    }
}
```

```json
{
    "price": [
        "123.12"
    ]
}
```

**XPath `|` operador para coincidir con múltiples expresiones**

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

```json
{
    "price_and_title": [
        "Calcetines",
        "123.12"
    ]
}
```

### `xpath_one`

#### HTML de ejemplo

```html
<body>
    <div class="product" id="socks">
        <div class="title">Calcetines</div>
        <div class="price">123.12</div>
        <div class="description">
            <ul>
                <li class="description-item">Muy</li>
                <li class="description-item">Bonitos</li>
                <li class="description-item">Calcetines</li>
            </ul>
        </div>
    </div>
</body>
```

**Devolver la primera coincidencia**

```json
{
    "first_description_item": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": [".//li/text()"]
            }
        ]
    }
}
```

```json
{
    "first_description_item": "Muy"
}
```

**Usando funciones XSLT**

```json
{
    "price": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": ["number(.//div[@class='price'])"]
            }
        ]
    }
}
```

```json
{
    "price": 123.12
}
```

## Manipulación de cadenas

### `amount_from_string`

#### HTML de ejemplo

```html
<body>
    <div class="product" id="socks">
        <div class="title">Calcetines</div>
        <div class="price">El precio es: 123.12 pesos</div>
    </div>
</body>
```

**Extraer cantidad de una cadena**

```json
{
    "price": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": [".//div[@class='price']/text()"]
            },
            {
                "_fn": "amount_from_string"
            }
        ]
    }
}
```

```json
{
    "price": 123.12
}
```

### `amount_range_from_string`

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <div class="price">
            El precio es: 123.12 pesos;
            El precio es: 345.12 pesos;
            El precio es: 678.12 pesos
        </div>
    </div>
</body>
```

**Extraer todas las cantidades de una cadena**

```json
{
    "prices": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": [".//div[@class='price']/text()"]
            },
            {
                "_fn": "amount_range_from_string"
            }
        ]
    }
}
```

```json
{    
    "prices": [
        123.12,
        345.12,
        678.12
    ]
}
```

### `join`

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <div class="price">
            El precio es: 123.12 pesos;
        </div>
        <div class="price">
            El precio es: 345.12 pesos;
        </div>
        <div class="price">
            El precio es: 678.12 pesos
        </div>
    </div>
</body>
```

**Unir un array de cadenas en una sola cadena**

```json
{
    "price_variants": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [".//div[@class='price']"]
            },
            {  // Si llamamos a normalize-space() en la primera función de la tubería, 
               // devolverá solo el primer valor.
                "_fn": "xpath",
                "_args": ["normalize-space(text())"]
            },  
            {
                "_fn": "join",
                "_args": ""
            }
        ]
    }
}
```

```json
{
    "price_variants": "El precio es: 123.12 pesos;El precio es: 345.12 pesos;El precio es: 678.12 pesos"
}
```

### `regex_find_all` <a href="#regex_find_all" id="regex_find_all"></a>

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <div class="description">
            [una descripción]
            [dos descripciones]
            [tres descripciones]
        </div>
    </div>
</body>
```

**Encontrar todas las coincidencias entre dos caracteres**

```json
{
    "descriptions": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": [".//div[@class='description']/text()"]
            },
            {
                "_fn": "regex_find_all",
                "_args": ["\\[(.*)\\]"]
            }
        ]
    }
}
```

```json
{
    "descriptions": [
        "una descripción",
        "dos descripciones",
        "tres descripciones"
    ]
}
```

### `regex_search` <a href="#regex_search" id="regex_search"></a>

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <div class="description">
            [una descripción]
            [dos descripciones]
            [tres descripciones]
            {la que necesito}
        </div>
    </div>
</body>
```

**Devolver la descripción entre dos caracteres**

```json
{
    "description": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": [".//div[@class='description']/text()"]
            },
            {
                "_fn": "regex_search",
                "_args": ["{(.*)}", 1]
            }
        ]
    }
}
```

```json
{
    "description": "la que necesito"
}
```

### `regex_substring`

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <div class="description">
            * una descripción
            * dos descripciones
            * tres descripciones
            * {esta que me gustaría que se reemplazara}
        </div>
    </div>
</body>
```

**Reemplazar una parte del texto con el valor especificado**

```json
{
    "descriptions": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": [".//div[@class='description']/text()"]
            },
            {
                "_fn": "regex_substring",
                "_args": ["{esta que me gustaría que se reemplazara}", "cuatro descripciones"]
            },
            {
                "_fn": "regex_find_all",
                "_args": ["\\*\\s(.*)\n"]
            }
        ]
    }
}
```

```json
{
    "descriptions": [
        "una descripción",
        "dos descripciones",
        "tres descripciones",
        "cuatro descripciones"
    ]
}
```

## Funciones comunes

### `convert_to_*`

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <div class="price">123</div>
        <div class="price">124</div>
        <div class="price">456</div>
        <div class="price">421</div>
        <div class="price">100</div>
    </div>
</body>
```

**Obtener el recuento de variantes de precio**

```json
{
    "price_variants": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [".//div[@class='price']"]
            },
            {
                "_fn": "length"
            }
        ]
    }
}
```

```json
{
    "price_variants": 5
}
```

**Obtener el recuento de variantes de precio en un array multidimensional**

HTML de ejemplo:

```html
<body>
    <div class="product">
        <property class="colors">
            <option class="color">Rojo</option>
            <option class="color">Verde</option>
            <option class="color">Azul</option>
        </property>
        <property class="sizes">
            <option class="size">S</option>
            <option class="size">M</option>
            <option class="size">L</option>
            <option class="size">XL</option>
        </property>
    </div>
</body>
```

```json
{
    "number_of_variants": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [".//property"]
            },
            {
                "_fn": "xpath",
                "_args": [".//option"]
            },
            {
                "_fn": "length"
            }
        ]
    }
}
```

```json
{
    "number_of_variants": [
        3,
        3
    ]
}
```

### `select_nth`

#### HTML de ejemplo

```html
<body>
    <div class="product" id="socks">
        <div class="title">Calcetines</div>
        <div class="price">123.12</div>
        <div class="description">
            <ul>
                <li class="description-item">Muy</li>
                <li class="description-item">Bonitos</li>
                <li class="description-item">Calcetines</li>
            </ul>
        </div>
    </div>
</body>
```

**Seleccionar el primer elemento de la descripción del array**

```json
{
    "price_and_title": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": ["//li[@class='description-item']/text()"]
            },
            {
                "_fn": "select_nth",
                "_args": 0
            }
        ]
    }
}
```

```json
{
    "price_and_title": "Muy"
}
```

**Seleccionar el último elemento de la descripción del array**

```json
{
    "price_and_title": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": ["//li[@class='description-item']/text()"]
            },
            {
                "_fn": "select_nth",
                "_args": -1
            }
        ]
    }
}
```

```json
{
    "price_and_title": "Calcetines"
}
```

## Funciones matemáticas

### `average`

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <div class="price">123</div>
        <div class="price">124</div>
        <div class="price">456</div>
        <div class="price">421</div>
        <div class="price">100</div>
    </div>
</body>
```

**Encontrar el promedio de todos los precios listados**

```json
{
    "price_average": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [".//div[@class='price']"]
            },
            {
                "_fn": "xpath_one",
                "_args": ["number(text())"]
            },
            {
                "_fn": "average"
            }
        ]
    }
}
```

```json
{
    "price_average": 244.8
}
```

### `max`

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <div class="price">123</div>
        <div class="price">124</div>
        <div class="price">456</div>
        <div class="price">421</div>
        <div class="price">100</div>
    </div>
</body>
```

**Encontrar el máximo de todos los precios listados**

```json
{
    "price_max": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [".//div[@class='price']"]
            },
            {
                "_fn": "xpath_one",
                "_args": ["number(text())"]
            },
            {
                "_fn": "max"
            }
        ]
    }
}
```

```json
{
    "price_max": 456.0
}
```

### `min`

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <div class="price">123</div>
        <div class="price">124</div>
        <div class="price">456</div>
        <div class="price">421</div>
        <div class="price">100</div>
    </div>
</body>
```

**Encontrar el promedio de todos los precios listados**

```json
{
    "price_min": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [".//div[@class='price']"]
            },
            {
                "_fn": "xpath_one",
                "_args": ["number(text())"]
            },
            {
                "_fn": "min"
            }
        ]
    }
}
```

```json
{
    "price_min": 100.0
}
```

### `product`

#### HTML de ejemplo

```html
<body>
    <div class="product">
        <property class="colors">
            <option class="color">Rojo</option>
            <option class="color">Verde</option>
            <option class="color">Azul</option>
        </property>
        <property class="sizes">
            <option class="size">S</option>
            <option class="size">M</option>
            <option class="size">L</option>
            <option class="size">XL</option>
        </property>
    </div>
</body>
```

**Obtener el recuento de diferentes variantes de producto**

```json
{
    "number_of_variants": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [".//property"]
            },
            {
                "_fn": "xpath",
                "_args": [".//option"]
            },
            {
                "_fn": "length"
            },
            {
                "_fn": "product"
            }
        ]
    }
}
```

```json
{
    "number_of_variants": 12
}
```


---

# Agent Instructions: 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:

```
GET https://developers.oxylabs.io/products/es/web-scraper-api/features/custom-parser/writing-instructions-manually/list-of-functions/function-examples.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
