【问题标题】:Trouble passing links from one function to another将链接从一个函数传递到另一个函数时遇到问题
【发布时间】:2018-10-19 19:22:26
【问题描述】:

我在node.js 中编写了一个非常小的脚本,使用requestcheerio 来解析连接到linkstitles,我已经从它的着陆页上抓取了它。

问题是我不知道如何将链接(从第一个函数填充)传递给第二个函数以便从那里获取标题。我对node.js 很陌生,所以不知道如何从第一个函数返回结果并将它们传递给后一个函数。

我遇到的错误:

for (const link of links) {
                   ^
ReferenceError: links is not defined

这是完整的脚本:

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

const url = 'https://news.ycombinator.com';

request(url, function (error, response, html) {
  if (!error && response.statusCode == 200) {
    var $ = cheerio.load(html);
    $('.title .storylink').each(function(){
    var links = $(this).attr("href");
    });
  }
});

for (const link of links) {
  (function(url) {
    request(url, function (error, response, html) {
      if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html);
        var title = $('title').eq(0).text();
        console.log(title);
      }
    });
})(link);
}

顺便说一句,脚本中使用的选择器完美无缺。我只需要知道将结果从一个函数传递到另一个函数。

【问题讨论】:

    标签: javascript node.js web-scraping request cheerio


    【解决方案1】:

    您的“链接”变量超出范围。它在“请求”中的回调之外。要么必须将 request 转换为 promise,使用 request-promise,要么将 for 循环移动到函数中以保持链接在范围内。

    https://www.npmjs.com/package/request-promise

    https://scotch.io/courses/10-need-to-know-javascript-concepts/callbacks-promises-and-async

    【讨论】:

      【解决方案2】:

      看来我找到了自己的解决方案。它成功了:

      var request = require('request');
      var cheerio = require('cheerio');
      
      const url = 'https://news.ycombinator.com';
      
      function getItems(callback){
        request(url, function (error, response, html) {
          if (!error && response.statusCode == 200) {
            var $ = cheerio.load(html);
            $('.title .storylink').each(function(){
            var links = $(this).attr("href");
            return callback(links,false);
            });
          }
        });
      }
      getItems((link)=>{
          request(link, function (error, response, html) {
            if (!error && response.statusCode == 200) {
              var $ = cheerio.load(html);
              var title = $('title').eq(0).text();
              console.log(title);
            }
          });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        相关资源
        最近更新 更多