2015-02-07 16 views
5

Sto riscontrando problemi nell'utilizzo dei selettori disponibili per Cheerio.js che utilizzo sul mio server Node. Il core è apparentemente basato su jQuery, tuttavia non riesco davvero a farlo funzionare usando la stessa selezione che vorrei con jQuery nativo.Iterating su TR in una tabella con Cheerio.js

Ho un DOM che sembra più o meno in questo modo:

<div class="test"> 
    <table class="listing"> 
     <thead><tr>few cells here</tr></thead> 
     <tfoot></tfoot> 
     <tbody><tr>These are the rows I want</tr></tbody> 
    </table> 
</div> 

Poiché ci sono due tabelle alla pagina con la classe "listing" Non posso scegliere che direttamente Quindi ho bisogno il riferimento al div con la classe "test". La selezione che posso eseguire con jQuery è simile a:

$('div.test tbody tr') 

Ma questo non funziona con Cheerio. Se eseguo $ ('div [class = "test"] tr') ottengo tutte le righe sul tavolo, anche le righe di thead, in modo che non funzioni per me.

Qualche ipotesi?

Aggiornamento: Questo è il codice vero e proprio che sto esecuzione (non funziona):

// Load the html 
var $ = cheerio.load(html, { 
    normalizeWhitespace: true 
}); 

$('div.tillgodo tbody tr').each(function(){ 
    console.log("Found credited course..."); 
    var children = $(this).children(); 
    var credits = parseFloat($(children[3]).text().replace(',', '.')); // We need to replace comma with a dot since parseFloats only supports dots by design 

    var row = { 
     "course" : $(children[1]).text().trim(), 
     "grade" : null, 
     "credits" : credits, 
     "date" : $(children[4]).text() 
    }; 

    // Push course to JSON object 
    console.log("Push course to object..."); 
    console.log("------------------------------------------\n"); 
    data.credited_courses.push(row); 
    data.credited_courses_credits += parseFloat(credits); 
}); 

Il seguente codice funziona per la tabella prima:

$('tr.incomplete.course').each(function(i, tr){ 
    console.log("This is course nr: " + parseInt(course_count+1)); 
    console.log("Found incompleted course..."); 
    var children = $(this).children(); 
    var credits = parseFloat($(children[2]).text().replace(',', '.').match(/(\+|-)?((\d+(\.\d+)?)|(\.\d+))/)[0]); // Filter out any parentheses and odd characters 
    var row = { 
     "course" : $(children[1]).text(), 
     "grade" : $(children[3]).text(), 
     "credits" : credits, 
     "date" : $(children[5]).text() 
    }; 

    // Sum the total amount of credits for all courses 
    console.log("Add credits to incompleted_credits..."); 
    data.incompleted_credits += credits; 

    console.log("Push course to object..."); 
    data.incompleted_courses.push(row); 
    course_count++; 
}); 

Quando Dico che non funziona significa che l'oggetto JSON che sto restituendo non ha le righe previste dalla seconda tabella.

Update 2 La tabella che voglio raschiare:

<div class="tillgodo"> 
    <h2>Tillgodoräknanden</h2> 
    <table class="listing"> 
    <thead> 
    <tr class="listingHeader"> 
     <th>Kurskod</th> 
     <th>Kursnamn</th> 
     <th>Beslutsfattare</th> 
     <th class="credits">Poäng</th> 
     <th>Datum</th> 
    </tr> 
    </thead> 
    <tfoot> 
    <tr class="listingTrailer"> 
     <td> 
     </td><td colspan="2">Summa tillgodoräknade poäng: 
     </td><td class="credits">10,5 
     </td><td> 
    </td></tr> 
    </tfoot> 

     <tbody><tr> 
      <td> 
      </td><td>Valfria kurser 
      </td><td>xxx 
      </td><td class="credits">10,5 
      </td><td class="nobreak">2013-06-03 
     </td></tr> 

    </tbody> 
</table> 
</div> 

aggiornamento finale (problema risolto) Il selettore avevo usato per tutto il tempo stava lavorando. Ma l'HTML sorgente era malformato e non aveva alcun tag tbody. Il browser (Chrome nel mio caso) ha risolto il problema, ma ha reso difficile trovare il vero problema.

+0

Pubblica il tuo codice, per favore. Ho caricato il tuo codice HTML e iterato attraverso gli elementi 'tr' bene usando il selettore che stai usando. Sospetto che il tuo selettore sia OK ma non stai utilizzando correttamente l'API di cheerio nel tuo javascript. –

+0

Ok, nessun problema. Aggiornata la domanda con il codice attuale. – Marty

+0

Penso che questo sia un caso in cui dovresti creare un [Esempio minimo, completo e verificabile] (http://stackoverflow.com/help/mcve). Nel codice di scraping come questo, tutto ciò che riguarda l'HTML, i selettori e il javascript deve essere allineato. Il diavolo è nei dettagli. Il tuo codice sembra fragile ma senza un MCVE non possiamo aiutare oltre "non commettere errori". –

risposta

0

si può provare $(div.test table.listing tr).text()

Questo vi darà il testo da tutti i tag tr in tale tabella

Problemi correlati