2017-04-13 1 views
0

Je suis l'analyse d'une simple page web en utilisant Cheerios et j'errait si possible est follwing:comment filtrer les objets cheerio dans `each` avec le sélecteur?

Avec un html de cette structure:

<tr class="human"> 
    <td class="event"><a>event1</a></td> 
    <td class="name">name1</td> 
    <td class="surname"><a>surname1</a></td> 
    <td class="date">2011</td> 
</tr> 
<tr class="human"> 
    <td class="event"><a>event2</a></td> 
    <td class="name">name2</td> 
    <td class="surname"><a>surname2</a></td> 
    <td class="date">2012</td> 
</tr> 
<tr class="human"> 
    <td class="event"><a>event3</a></td> 
    <td class="name">name3</td> 
    <td class="surname"><a>surname3</a></td> 
    <td class="date">2013</td> 
</tr> 

Une fois que je reçois tous les objets Cheerio qui correspondent au sélecteur tr.human Je veux être en mesure de faire une boucle à travers eux pour mapper des valeurs dans les classes name, surname etc à un objet.

Jusqu'à présent, j'atteint ceci:

var cheerio = require('cheerio'); 
var fs = require('fs') 

fs.readFile('./humans.html', 'utf8', function (err,data) { 
    if (err) { 
     return console.log(err); 
    } 

    const $ = cheerio.load(data) 
    var results = $('tr.human') 

    results.each(function(i, result){ 

     var date = result.children[3] 
     var name = result.children[1] 
     var surname = result.children[2] 

     var object = {"name":name,"date":date,"surname":surname} 
    }) 
}); 

Mais je veux me débarrasser d'appeler à l'index dans children, au lieu que je voudrais filtrer result par un sélecteur, quelque chose comme ceci:

var date = result.children('td.date') 

mais au-dessus des résultats en erreur suivant:

var date = result.children('td.date') 
         ^
TypeError: result.children is not a function 

Je suis n ew à noeud et cheerio, lisez les docs Cheerio, mais je suis assez coincé avec celui-ci. Comment pourrais-je obtenir les valeurs dans certaines classes avec l'utilisation de sélecteurs? Je dois admettre que je veux première boucle et à l'intérieur de chaque carte d'itération à l'objet, ne pas faire correspondre les sélecteurs, puis boucle comme probablement cela ne garantit pas l'ordre correct des éléments dans les résultats appariés (boucle et filtre est pas commutatif ici), ou c'est le cas?

Répondre

4

result est un élément nu, non enveloppé dans cheerio. Similaire à jQuery, vous pouvez envelopper à nouveau dans $()

var date = $(result).children('td.date'); 
+0

avec cette approche, je reçois résultat très bizarre, et 'date' devient objet plutôt générique sans attributs tous les autres (' name', 'surname') avoir. Mais je vais en lire plus sur l'emballage/déballage dans jQuery, +1, merci :) –