Невозможно получить результаты с помощью обратного вызова - PullRequest
0 голосов
/ 09 апреля 2019

Я написал скрипт в node, используя две разные функции getPosts() и getContent(), обеспечивающие обратный вызов внутри них, чтобы напечатать результат вызова отдельной функции getResult(). Селекторы, определенные в моем скрипте, безупречны.

Однако, когда я выполняю свой скрипт, он ничего не печатает. Это тоже не выдает никакой ошибки. Я пытался имитировать логику, представленную Нейлом в этом посте .

Как я могу сделать это?

Я уже написал:

var request = require('request');
var cheerio = require('cheerio');

const url = 'https://stackoverflow.com/questions/tagged/web-scraping';

function getPosts(callback){
  request(url, function (error,response, html) {
    if (!error && response.statusCode == 200){
      var $ = cheerio.load(html);
      $('.summary .question-hyperlink').each(function(){
        var items = $(this).text();
        var links = $(this).attr("href");
        callback(items,links);
      });
    }
  });
}

function getContent(item,link,callback){
  request(link, function (error,response, html) {
    if (!error && response.statusCode == 200){
      var $ = cheerio.load(html);
      var proLink = $('.user-details > a').eq(0).attr("href");
      callback({item,link,proLink});
    }
  });
}

function getResult() {
  getPosts(function(item,link) {
    getContent(item,link,function(output){
      console.log(output);
    });
  });
}

getResult();

1 Ответ

1 голос
/ 09 апреля 2019

Значение link, полученное от getPosts, является относительной ссылкой, что означает, что запрос не выполнен. Вы можете извлечь имя хоста из его собственной переменной и создать полный URL из имени хоста + относительной ссылки.

const host = 'https://stackoverflow.com';
const url = '/questions/tagged/web-scraping';

// ...

function getContent(item,link,callback){
  // Here we use the absolute URL
  request(host + link, function (error,response, html) {
    if (!error && response.statusCode == 200){
      var $ = cheerio.load(html);
      var proLink = $('.user-details > a').eq(0).attr("href");
      callback({item,link,proLink});
    }
  });
}
...