Node.js / Cheerio无法摆脱空白

时间:2018-11-06 21:52:46

标签: node.js web-scraping cheerio

我正努力在betfair上刮擦今天的比赛,并希望获得: 主队
客队
x奇数
画奇数
y奇

问题是我不断获得多个空格,我已经尝试了很多并且无法修复它,问题不在于修整,而是由于执行流程导致空行
有人可以告诉我我做错了什么吗?

我的代码:

const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');

var url = 'https://www.betfair.com/sport/football';

var customHeaderRequest = request.defaults({
    headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
})

customHeaderRequest.get(url, function(err, resp, body){
  $ = cheerio.load(body);
  links = $('.section-list .section:nth-child(2) .event-list li');
  $(links).each(function(i, link){
    var home = $(link).find('.event-information div:nth-child(3) div a div span.team-name:nth-child(1)');
    var h = home.text();
    if(h != null || h!=''){
    fs.appendFile('message.txt', h+'\n', function (err) {});
  }
  });
});

1 个答案:

答案 0 :(得分:1)

您不应该在这样的循环中调用fs.appendFile(),并且可能需要比使用的更好的空行测试。 fs.appendFile()是一个异步操作,实际上,您是在不等待先前操作完成的情况下,依次调用一大堆fs.appendFile()操作。

您可以使用流,也可以等到上一个fs.appendFile()完成后再调用下一个。

而且,如果要确保没有空白效果,则需要一个更好的过滤器来过滤其中只有空格的结果(我在下面的代码中添加了.trim())。

这是一种方法:

const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
const util = require('util');
const appendFile = util.promisify(fs.appendFile);

var url = 'https://www.betfair.com/sport/football';

var customHeaderRequest = request.defaults({
    headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
})

customHeaderRequest.get(url, async function(err, resp, body){
  try {
    let $ = cheerio.load(body);
    let links = $('.section-list .section:nth-child(2) .event-list li').toArray();
    for (let link of links) {
        const home = $(link).find('.event-information div:nth-child(3) div a div span.team-name:nth-child(1)').text().trim();
        if (home) {
          await appendFile('message.txt', home +'\n');
        }
    }
  } catch(e) {
    // error writing to the file, handle that error here
  }
});

其他注意事项:您还应该始终声明所使用的所有局部变量,因此永远不允许它们是隐式全局变量。