【问题标题】:Nodejs / Cheerio cannot get rid of whitespacesNodejs / Cheerio 无法摆脱空格
【发布时间】:2018-11-07 06:30:10
【问题描述】:

我正在尝试在 betfair 上搜索今天的比赛,并希望获得: 主队
客队
x 奇数
画奇数
奇怪

问题是我不断收到多个空格,我尝试了很多但无法修复它,问题不在于修剪,而是导致空行的执行流程
谁能告诉我我做错了什么?

我的代码:

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) {});
  }
  });
});

【问题讨论】:

    标签: node.js web-scraping cheerio


    【解决方案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
      }
    });
    

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

    【讨论】:

    • 它也在 console.log 中产生相同的结果。我使用 fs 只是为了测试。知道发生了什么吗?
    • @HashimRoja - 可能你的home 值在某些情况下只包含空格,所以你看到了看起来像空行的东西。我在我的答案中添加了一个代码示例,它使用 .trim()await 来过滤掉只有空格的结果并确保循环正在等待 appendFile() 完成。
    • 我尝试了修剪和大量的正则表达式函数,但没有奏效。网站在文本前后都有空格和换行符
    • 刚看到你的代码回家测试一下谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多