所以我在将静态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;
答案 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。之后,您的选择器应该返回您可能期望的元素。