2016-08-10 5 views
0

Hey Jungs und Damen zuerst ist dies meine erste Frage hier in stackoverflow also sei nicht so schwer auf mich .. aber w/e: P. Ich habe ein Problem .. Ich bin völlig neu im Web Scraping und im Moment habe ich das Problem, dass ich nicht die richtigen Elemente auswählen kann. Mein Code sieht wie folgt aus:Cheerio direkte Kindwähler

var express = require('express'); 
var path = require('path'); 
var request = require('request'); 
var cheerio = require('cheerio'); 
var fs = require('fs'); 

var app = express(); 
var port = 8000; 

var url = "http://www.finanzparasiten.de/html/links/awd.html"; 

request(url, function (err, resp, body) { 
    if(!err) { 
     var $ = cheerio.load(body) 

     var test = $('body table table table > tbody > tr > td > p'); 
     console.log(test.html()) 
     test.each(function (ii, asdf) { 
      var rr = $(asdf).find("table").find("tr").first().find('td:nth-child(2)').text(); 
      console.log(asdf); 
     }) 
    } else { 
     console.log("we encountered an error: " + err); 
    } 
}); 

app.listen(port); 
console.log('server is listening on ' + port); 

Es Protokollierung NULL für die Variable Test hält. Es scheint, als hätte cheerio Probleme mit dem> Selektor. Mit jQuery würde diese Auswahl wie erwartet funktionieren.

Dank @ Logols anwser konnte ich das erste Problem lösen, aber jetzt habe ich das Problem, dass ich direkte Kinder nach Körper auswählen muss und es scheint zu Bug als der tbody .. any1 hat einen Workaround?

Antwort

1

Original:

soweit ich erinnere mich (wenn ich cheerio verwendet letzten Zeit) tbody wird in cheerio nicht erkannt, lass es einfach und verwende stattdessen:

table> tr> td

PS: thead arbeitete

Update:

es manchmal sogar mit tbody zu funktionieren scheint, versuchen Sie dies in REPL

const cheerio = require('cheerio'); 
const html = '\ 
<!DOCTYPE html>\ 
<html>\ 
    <head>\ 
    <title>Cheerio Test</title>\ 
    </head>\ 
    <body>\ 
    <div id="#1">\ 
     <table>\ 
     <thead>\ 
      <tr>\ 
      <th>Month</th>\ 
      <th>Savings</th>\ 
      </tr>\ 
     </thead>\ 
     <tfoot>\ 
      <tr>\ 
      <td>Sum</td>\ 
      <td>180</td>\ 
      </tr>\ 
     </tfoot>\ 
     <tbody>\ 
      <tr>\ 
      <td>January</td>\ 
      <td>100</td>\ 
      </tr>\ 
      <tr>\ 
      <td>February</td>\ 
      <td>80</td>\ 
      </tr>\ 
     </tbody>\ 
     </table>\ 
    </div>\ 
    </body>\ 
</html>'; 
const dom = cheerio.load(html); 

// not working: 
let tds1 = dom('div#1 > table > tbody > tr > td').map(function() { 
    return dom(this).text().trim(); 
}).get(); 

// working: 
let tds2 = dom('table > tbody > tr > td').map(function() { 
    return dom(this).text().trim(); 
}).get(); 

// not working: 
let tds3 = dom('div#1 > table > tr > td').map(function() { 
    return dom(this).text().trim(); 
}).get(); 

console.log(tds1); 
console.log(tds2); 
console.log(tds3); 
+0

wow das scheint zu funktionieren: O danke, könnte es möglich sein, dass Körper auch nicht erkannt wird? z.B. body> div: last-of-type scheint auch fehlgeschlagen –

+0

Ich spielte ein bisschen herum und manchmal funktioniert es manchmal nicht .. siehe user3366016 tiefere Untersuchung – John

1

Update:

Basierend auf @ logol Antwort, überprüfte ich die docs for Cheerio und es sagt, seine Wähler auf CSSSelect Bibliothek gebaut werden. Ihre docs haben eine Liste von Selektoren. Child- und Parent-Selektoren werden unterstützt, und es scheint auch alle Elementselektoren zu enthalten. Jedoch kennzeichnet dieses g ithub issue das tbody Problem.

Original:

Haben Sie bedeuten die doppelten Tabellen in Ihrer Wähler aufgeführt zu haben, und wie Sie es sind Druck in der Konsole aus.

Try this:

var test = $('body table > tbody > tr > td > p'); 
console.log(test.innerHTML) 

Der Ausgang dieses auf der Webseite ist:

<span class="TDheadlinebig">AWD - Allgemeiner 
       Wirtschaftsdienst</span><span class="TDnormal"><br> 
       </span><span class="TDheadlinenormal">zweitgrößte "Strukkibude" 
       </span><span class="TDnormal"><br> 
       </span> 
+0

Dank für ur antworten, aber das ist nicht das Problem, du könntest die URL inspizieren, wenn du willst. Das passiert mir bei jeder direkten Auswahl. Vielleicht war das eine schlechte Auswahl, aber es ist auch NULL, wenn ich deine Auswahl verwende. –

+0

mit jquery ja. Aber wie ich erwähnt habe, benutze ich Cheerio für das Web-Scraping –

+0

@logol war auf etwas :) Ich war nicht; aber ich habe ein paar dokumente und ein github-problem mit demselben tbody-problem hinzugefügt. – user3366016