【问题标题】:Cheerio returns undefined when calling .each() on elementsCheerio 在元素上调用 .each() 时返回 undefined
【发布时间】:2018-04-02 21:56:47
【问题描述】:

我想向网站发出请求,获取其 html,然后将其提供给cheerio。我需要获取类".thumb" 的所有元素的所有"href" 属性。我在控制台上显示结果,我只是多次不确定,我假设它是针对找到的每个元素。尝试循环使用标签或标识符的任何其他元素时,我得到未定义,但如果我不循环并且只获取第一个元素,则会给出正确的值。

  function firstReq(){
    req(url, (err,res,html)=>{
       if(err){console.error(err);}
       var $ = cheerio.load(html);
       var arr = []
       $("a").each(()=>{
         console.log($(this).attr("href"));
       });
    });
  }

我尝试console.log(html) 来检查文档是否正常。我还尝试在迭代中设置setTimeout,也许是为了给"request""cheerio" 时间来加载文件,但还是一样。我尝试首先将 html 文件从url 下载到我的计算机(在函数之外,在调用之前),然后将其传递给cheerio,但仍然未定义。

这是我第一个使用 Node 的个人项目,我很困惑。任何帮助表示赞赏。

【问题讨论】:

  • 我相信问题在于在箭头函数中使用this。切换到关键字函数,或使函数接受参数$("a").each( element => { console.log($(element).attr("href")) })
  • 添加到@Sidney,如果你想使用箭头函数,你可以使用.each((i, elem) => {...})elem === this 在这种情况下。
  • @Sidney - 你为什么不发布答案?
  • 这个答案对我有帮助,谢谢。我认为箭头功能与正常功能完全一样。

标签: javascript jquery html node.js cheerio


【解决方案1】:

你可以使用两种方式here:

箭头函数

function firstReq(){
   req(url, (err,res,html)=>{
     if(err){console.error(err);}
     var $ = cheerio.load(html);
     var arr = []
     $("a").each((i , elem)=>{
       console.log($(elem).attr("href"));
     });
   });
}

或函数:

function firstReq(){
   req(url, (err,res,html)=>{
     if(err){console.error(err);}
     var $ = cheerio.load(html);
     var arr = []
     $("a").each(function(){
       console.log($(this).attr("href"));
     });
   });
}

【讨论】:

    【解决方案2】:
    request(url, (err,res,html)=>{
           if(err){console.error(err);}
           var $ = cheerio.load(html);
           var arr = []
           $("a").each((index,a)=>{
             console.log($(a).attr("href"));
           });
        });
    

    【讨论】:

      猜你喜欢
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多