# Exemplos de funções de parsing

## Processamento de HTML

### `element_text`

#### HTML de exemplo

```html
<!DOCTYPE html>
<html>
<body>
    <div id="product">
        <div id="product-description">Este é um bom produto</div>
        <div id="product-price">    12  3


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

**Extrair texto do elemento HTML e remover espaços em branco**

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

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

**Dado um valor string como entrada, não fazer 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 exemplo

```html
<body>
    <div class="product" id="socks">
        <div class="title">Meias</div>
        <div class="price">123.12</div>
        <div class="description">
            <ul>
                <li class="description-item">Muito</li>
                <li class="description-item">Bom</li>
                <li class="description-item">Meias</li>
            </ul>
        </div>
    </div>
</body>
```

**Obter todos os itens da descrição**

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

```json
{
    "description_items": ["Very", "Nice", "Socks"]
}
```

**Obter o primeiro item da descrição**

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

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

**Verificar se o elemento da seção de descrição existe**

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

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

**Obter preço como número**

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

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

**Múltiplas expressões para usar como fallback caso a expressão anterior falhe**

```json
{
    "price": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [
                    "//div[@class='product-price']/text()", <--- this does not find anything
                    "//div[@class='price']/text()" <--- this finds the target price
                ]
            }
        ]
    }
}
```

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

**XPath `|` operador para combinar com múltiplas expressões**

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

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

### `xpath_one`

#### HTML de exemplo

```html
<body>
    <div class="product" id="socks">
        <div class="title">Meias</div>
        <div class="price">123.12</div>
        <div class="description">
            <ul>
                <li class="description-item">Muito</li>
                <li class="description-item">Bom</li>
                <li class="description-item">Meias</li>
            </ul>
        </div>
    </div>
</body>
```

**Retornar a primeira correspondência**

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

```json
{
    "first_description_item": "Very"
}
```

**Usando funções XSLT**

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

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

## Manipulação de strings

### `amount_from_string`

#### HTML de exemplo

```html
<body>
    <div class="product" id="socks">
        <div class="title">Meias</div>
        <div class="price">O preço é: 123.12 pesos</div>
    </div>
</body>
```

**Extrair valor de string**

```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 exemplo

```html
<body>
    <div class="product">
        <div class="price">
            O preço é: 123.12 pesos;
            O preço é: 345.12 pesos;
            O preço é: 678.12 pesos
        </div>
    </div>
</body>
```

**Extrair todos os valores de uma string**

```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 exemplo

```html
<body>
    <div class="product">
        <div class="price">
            O preço é: 123.12 pesos;
        </div>
        <div class="price">
            O preço é: 345.12 pesos;
        </div>
        <div class="price">
            O preço é: 678.12 pesos
        </div>
    </div>
</body>
```

**Juntar um array de strings em uma única string**

```json
{
    "price_variants": {
        "_fns": [
            {
                "_fn": "xpath",
                "_args": [".//div[@class='price']"]
            },
            {  // If we call normalize-space() in first pipeline function, 
               // it will return only the first value.
                "_fn": "xpath",
                "_args": ["normalize-space(text())"]
            },  
            {
                "_fn": "join",
                "_args": ""
            }
        ]
    }
}
```

```json
{
    "price_variants": "The price is: 123.12 pesos;The price is: 345.12 pesos;The price is: 678.12 pesos"
}
```

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

#### HTML de exemplo

```html
<body>
    <div class="product">
        <div class="description">
            [one description]
            [two description]
            [three description]
        </div>
    </div>
</body>
```

**Encontrar todas as correspondências entre dois caracteres**

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

```json
{
    "descriptions": [
        "one description",
        "two description",
        "three description"
    ]
}
```

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

#### HTML de exemplo

```html
<body>
    <div class="product">
        <div class="description">
            [one description]
            [two description]
            [three description]
            {the one i need}
        </div>
    </div>
</body>
```

**Retornar descrição entre dois caracteres**

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

```json
{
    "description": "the one i need"
}
```

### `regex_substring`

#### HTML de exemplo

```html
<body>
    <div class="product">
        <div class="description">
            * one description
            * two description
            * three description
            * {this one i would like to get replaced}
        </div>
    </div>
</body>
```

**Substituir parte do texto por um valor especificado**

```json
{
    "descriptions": {
        "_fns": [
            {
                "_fn": "xpath_one",
                "_args": [".//div[@class='description']/text()"]
            },
            {
                "_fn": "regex_substring",
                "_args": ["{this one i would like to get replaced}", "four description"]
            },
            {
                "_fn": "regex_find_all",
                "_args": ["\\*\\s(.*)\n"]
            }
        ]
    }
}
```

```json
{
    "descriptions": [
        "one description",
        "two description",
        "three description",
        "four description"
    ]
}
```

## Funções comuns

### `convert_to_*`

#### HTML de exemplo

```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>
```

**Obter a contagem de variantes de preço**

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

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

**Obter a contagem de variantes de preço em um array multidimensional**

HTML de exemplo:

```html
<body>
    <div class="product">
        <property class="colors">
            <option class="color">Vermelho</option>
            <option class="color">Verde</option>
            <option class="color">Azul</option>
        </property>
        <property class="sizes">
            <option class="size">P</option>
            <option class="size">M</option>
            <option class="size">G</option>
            <option class="size">GG</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 exemplo

```html
<body>
    <div class="product" id="socks">
        <div class="title">Meias</div>
        <div class="price">123.12</div>
        <div class="description">
            <ul>
                <li class="description-item">Muito</li>
                <li class="description-item">Bom</li>
                <li class="description-item">Meias</li>
            </ul>
        </div>
    </div>
</body>
```

**Selecionar o primeiro item da descrição do array**

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

```json
{
    "price_and_title": "Very"
}
```

**Selecionar o último item da descrição do array**

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

```json
{
    "price_and_title": "Socks"
}
```

## Funções matemáticas

### `average`

#### HTML de exemplo

```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 a média de todos os preços 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 exemplo

```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 o máximo de todos os preços 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 exemplo

```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 a média de todos os preços 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 exemplo

```html
<body>
    <div class="product">
        <property class="colors">
            <option class="color">Vermelho</option>
            <option class="color">Verde</option>
            <option class="color">Azul</option>
        </property>
        <property class="sizes">
            <option class="size">P</option>
            <option class="size">M</option>
            <option class="size">G</option>
            <option class="size">GG</option>
        </property>
    </div>
</body>
```

**Obter a contagem de diferentes variantes de produto**

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

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