Exemplos de instruções de parsing
Veja exemplos práticos de instruções de parsing para o Custom Parser: lide com objetos aninhados, listas, erros e arrays de arrays.
O trecho HTML a seguir é analisado usando instruções de parsing de exemplo nas próximas seções.
HTML de exemplo
<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">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>
</div>
</body>Mínimo necessário
Exemplo 1. Seleção de itens de descrição de shoes usando XPath.
O xpath a função encontrará um único item e o colocará em uma lista como uma string:
O exato xpath comportamento da função é descrito aqui.
Instruções de parsing aninhadas
Você está segmentando esta parte do HTML de exemplo:
E você gostaria que o resultado analisado tivesse a seguinte estrutura:
As instruções de parsing ficariam da seguinte forma.
Exemplo 2. Instruções de parsing são usadas para analisar shoes informações.
xpath_one funciona de forma semelhante a xpath, mas em vez de retornar uma lista de todas as correspondências, ela retorna o primeiro item correspondente.
No exemplo acima, o shoes propriedade é a única propriedade definida no escopo das instruções mais externas. A shoes propriedade contém instruções de parsing aninhadas.
O shoes o escopo de instruções não tem um pipeline definido (_fns propriedade está ausente). Isso significa que pipelines definidos em title, preço, e description escopos usarão o documento-sobre-análise como entrada do pipeline.
No Exemplo 2, você pode ver uma repetição de //div[@id='shoes'] em expressões XPath. A repetição pode ser evitada definindo um pipeline no shoes escopo:
Exemplo 3. Definindo um pipeline no shoes escopo das instruções para evitar repetição de expressões XPath.
Usando as instruções de parsing fornecidas no Exemplo 3, o Custom Parser irá:
Começar processando
shoes._fnspipeline, que irá produzir oshoeselemento HTML;Pegar
shoes._fnsa saída do pipeline e usá-la como entrada para pipelines definidos emtitle,preço, edescriptionescopos;Processar
title,preço, edescriptionpipelines para produzir os valores finais.
O resultado ficará igual ao resultado do Exemplo 2:
A principal diferença entre o Exemplo 2 e o Exemplo 3 é que no Exemplo 3, o pipeline é definido no shoes escopo. Esse pipeline adicional seleciona o elemento dos shoes e o passa para pipelines adicionais encontrados mais abaixo na hierarquia de instruções.
Lista de objetos aninhados
O HTML de exemplo é usado novamente como o documento-sobre-análise.
Se você quer que seu resultado analisado se pareça com isto:
As instruções de parsing ficariam da seguinte forma:
Exemplo 4. Analisando todos os produtos encontrados no documento HTML.
A estrutura da instrução de parsing é semelhante à do Exemplo 3. No entanto, há duas grandes exceções:
xpathé usado em vez dexpath_oneinproducts._fnspipeline.products._fnso pipeline agora irá produzir uma lista de todos os elementos que correspondem à expressão XPath fornecida (uma lista de elementos product)._itemspropriedade reservada é usada para indicar que você quer formar uma lista iterando por cada item daproducts._fnssaída do pipeline e passando/processando cada item da lista separadamente pelo escopo do pipeline.
Se _items a propriedade reservada não tivesse sido usada nas instruções de parsing do Exemplo 4, o resultado analisado seria o seguinte:
_items é usado para especificar que o Custom Parser deve passar itens da lista separadamente em vez da lista inteira pelas instruções de parsing.
Selecionar o N-ésimo elemento de uma lista
Esta seção demonstra a flexibilidade dos pipelines. O mesmo problema pode ser abordado de diferentes maneiras.
Várias opções podem ser usadas para selecionar o N-ésimo elemento de uma lista de quaisquer valores.
O HTML de exemplo é novamente usado como exemplo. Você tem múltiplas opções para selecionar o 2º produto.
Opção 1
Você pode utilizar o seletor XPath [] e definir a seleção na expressão XPath.
Exemplo 5. Selecionar o 2º preço usando o seletor XPath [].
Resultado:
Opção 2
Você também pode usar a função xpath para encontrar todos os preços e encaminhá-la para a função select_nth, que seleciona o n-ésimo elemento da lista extraída de preços.
Exemplo 6. Selecionar o 2º valor usando a função `select_nth`.
Resultado:
Observe como a select_nth função retorna um item de uma lista enquanto a xpath função retorna uma lista de itens, mesmo se um único item for encontrado.
Opção 3
Você pode usar select_nth com qualquer tipo de lista, incluindo listas de elementos HTML:
Exemplo 7. Selecionando todos os elementos HTML de produto com class="product" ==> selecionando o 2º elemento de produto da lista ==> extraindo o texto do preço do elemento HTML do produto selecionado.
Resultado:
Tratamento de erros
Dado o seguinte trecho HTML:
E tentando analisá-lo com as seguintes instruções de parsing:
O Custom Parser retornará um resultado analisado onde preço e title foram analisados normalmente, mas o description falhou ao ser analisado devido à convert_to_float função falhar ao converter string to float:
Por padrão, todos os erros são contados como avisos e são colocados dentro da lista _warnings Se você quiser ignorar os erros ao analisar um campo, eles podem suprimir avisos/erros com "_on_error": "suppress" parâmetro:
O que então produzirá o seguinte resultado:
Array de arrays
O Custom Parser permite arrays N-dimensionais em resultados analisados. Como exemplo, vamos usar o seguinte trecho HTML:
Suponha que você queira analisar o documento de modo que o resultado seja um array 2D 3x3 de inteiros:
Para transformar o HTML no JSON acima, você pode usar as seguintes instruções de parsing:
Atualizado
Isto foi útil?

