Cheerio刮伤仅返回两排

时间:2015-09-05 12:42:12

标签: node.js web-scraping cheerio

所以我在将静态HTML文件添加到我的Node应用程序之前对其进行了测试。

问题在于它没有返回所有行。

在网站上:

$('#sport tr').length
//Returns 13

在Cheerio:

 $('#sport tr').length
    //Returns 2

我很难过,这是我正在使用的代码。我已经将URL作为证据包含在内,因此如果您愿意,可以自己访问。

我怀疑它与var $ = cheerio.load(html);有关但是我在Cheerio没有经验直接说这就是问题。

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

app.get('/scrape', function(req, res){

var url = 'http://www.olbg.com/football.php';
    var json = [];
request(url, function(error, response, html){
    if(!error){
        var $ = cheerio.load(html);

        console.log($('#sport tr').length);
    var headers = [];
    $('#sport tr th').each(function(i, th) {
      var text = $(th).text();
      if (text.trim() !== "") {
        headers[i] = text.replace(/[\t\n\r\s]/mgi, '');
      }
    });

    $('#sport tr').each(function(i, tr) {

      // skip if header
      if (!$(tr).is('th')) {
        var temp = {};
        temp["Event"] = $(tr).find('td').eq(0).text().trim();

        temp["TopSelection"] = $(tr).find('td').eq(1).text().trim();

        temp["BookieOdds"] = $(tr).find('td').eq(2).text().trim();

        temp["OLBGRating"] = $(tr).find('td').eq(3).find('img').length;

        if (temp["Event"] !== "" || temp["TopSelection"] !== ""){
          json.push(temp);
        }

      }

    });



}


// To write to the system we will use the built in 'fs' library.
// In this example we will pass 3 parameters to the writeFile function
// Parameter 1 :  output.json - this is what the created filename will be called
// Parameter 2 :  JSON.stringify(json, null, 4) - the data to write, here we do an extra step by calling JSON.stringify to make our JSON easier to read
// Parameter 3 :  callback function - a callback function to let us know the status of our function

fs.writeFile('output.json', JSON.stringify(json), function(err){

    console.log('File successfully written!');

})

// Finally, we'll just send out a message to the browser reminding you that this app does not have a UI.
res.send(json);

    });
});
app.listen("8081");
console.log("Magic happens on port 8081"); 
exports = module.exports = app;

1 个答案:

答案 0 :(得分:1)

您没有获得预期结果的原因是因为该页面上的(表格)html被破坏了。如果您查看<td>的第二个<tr>中的第二个table#sport,您会看到“额外”</td>。这导致<td>所在的table#sport在某些解析器上关闭(并隐式关闭table#sport),因为这是最接近的开放<td>。这就是解析器仅报告2 <tr>而不是13的原因。您期望的其他<tr>现在超出table#sport

可能最好的办法是在将HTML传递给cheerio之前,首先通过HTML整理程序/脚本(例如this one并启用clean选项)传递html。之后,您的选择器应该返回您可能期望的元素。