Nodejs / Cheerio не могут избавиться от пробелов - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь очистить сегодняшние матчи на Betfair и хочу получить: Хозяева
команда гостей
х нечетный
ничья нечетная
у нечетный

проблема в том, что я продолжаю получать несколько пробелов, я много пробовал и не могу это исправить, проблема не в обрезке, а в потоке выполнения, который вызывает пустые строки
Может кто-нибудь сказать мне, что я делаю не так?

Мой код:

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 голосов
/ 07 ноября 2018

Вы не должны вызывать 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
  }
});

Другие примечания: Вы также должны всегда объявлять все локальные переменные, которые вы используете, чтобы им никогда не разрешалось быть неявными глобальными переменными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...