【问题标题】:Save array from cheerio in node.js在 node.js 中从cheerio 保存数组
【发布时间】:2014-08-16 20:06:56
【问题描述】:

我有此代码,但无法创建新数组以供进一步使用:

var request = require("request");
var cheerio = require("cheerio");
var pag = [];
request('http://www.tastez.ro/tv.php?query=sopcast', function(error, response, body) {
  if (error) {
    return console.error('upload failed:', error);
  }

  var $ = cheerio.load(body);
    links = $(".page a"); //use your CSS selector here
    $(links).each(function(i, link){    
      var   sop = $(this).attr('href');
      pag[i] = sop;  //aici pun val gasite in locuri in array
    });
  pag.push(', '); 
});
for (var i=0; i<2; i++){
  console.log(pag[i]);
}

当我运行代码时,它会列出 undefined。但是如果我这样写代码:

var request = require("request");
var cheerio = require("cheerio");
var pag = [];
request('http://www.tastez.ro/tv.php?query=sopcast', function(error, response, body) {
  if (error) {
    return console.error('upload failed:', error);
  }

  var $ = cheerio.load(body);
  links = $(".page a"); //use your CSS selector here
  $(links).each(function(i, link){    
    var sop = $(this).attr('href');
    pag[i] = sop;  //aici pun val gasite in locuri in array
  });
  pag.push(', ');
  for (var i=0; i<2; i++){
    console.log(pag[i]);
  }   
});

然后它显示正确的结果,但当我以后想使用它时仍然是undefined。 有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: node.js arraylist cheerio


    【解决方案1】:

    Node.js 是异步的,这意味着当你去打印数组时,scrape 还没有完成。

    我不完全确定您的最终目标是什么,但这里有一种方法可以通过最小的更改来做您正在尝试的事情:

    var request = require("request");
    var cheerio = require("cheerio");
    var pag = [];
    
    var scrape = function( callback ) {
        request('http://www.tastez.ro/tv.php?query=sopcast', function(error, response, body) {
          if (error) {
            return console.error('upload failed:', error);
          }
    
        var $ = cheerio.load(body);
         links = $(".page a"); //use your CSS selector here
          $(links).each(function(i, link){    
            var sop = $(this).attr('href');
            pag[i] = sop;  //aici pun val gasite in locuri in array
    
          });
        pag.push(', '); 
        if (callback) callback()
        });
    }
    scrape(function() {
        for (var i=0; i<2; i++){
        console.log(pag[i]);}
    })
    

    【讨论】:

    • 你好,谢谢你的重播,但还是不行。我正在尝试执行以下操作:在网页中查找一些链接,将它们保存在数组中,使用数组中的值生成字符串,使用该字符串搜索新链接。我认为我的问题是数组在函数之外不可用。
    【解决方案2】:

    Catalyst 是对的,问题是您没有等待异步请求调用完成。这是我的解决方案:

    function getLinks(callback){
    
      request('http://www.tastez.ro/tv.php?query=sopcast', function(error, response, body) {
      if (error) {
        callback(new Error('upload failed:', error),null);
      }
      var pag = [];
      var $ = cheerio.load(body);
      links = $(".page a"); //use your CSS selector here
      $(links).each(function(i, link){    
        var sop = $(this).attr('href');
        pag.push(sop);  //aici pun val gasite in locuri in array
      });
      callback(null, pag);
    
      });
    
    }
    getLinks(function(err,links){
      if(err) return console.log(err);
      console.log(links.join(','));
    })
    

    在这里,我定义了一个进行请求调用的函数,它接受标准节点回调约定中的回调,将错误消息作为第一个参数,将结果作为第二个参数。然后使用将打印结果的回调调用该方法。

    【讨论】:

    • 好的修复,我没能及时回来修复它。
    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多