2016-03-08 99 views
0

我目前正在开发一个项目并且有一些关于javascript/nodejs/request/cheerio的问题。从请求中提取数据/ cheerio

request(address , function (error, response, html) { 
    if (!error && response.statusCode == 200) { 
     var $ = cheerio.load(html); 
     $('iframe').each(function(i, element){ 
     var a = $(this).attr('src'); 
}); 

} });

所以我有上面的代码精确地抓取我想要从一些网站的数据。我希望它稍后在某个模板中呈现它。然而,似乎var a只存在于上面的代码中,并且没有办法让它成为全局的(不介意它)或以某种方式返回它。有任何想法吗?

+0

看看在http://stackoverflow.com/q/500431/1859022 – user1859022

回答

1

使用Promise可以帮助我们轻松提取并稍后使用异步加载的数据。在下面的代码片段,我裹着你的逻辑成返回解析必要数据的承诺的功能:

function iframes(url) { 
    return new Promise((resolve, reject) => { 
     request(url , function (error, response, html) { 
      if (!error && response.statusCode == 200) { 
       const $ = cheerio.load(html); 

       // Extract list of each iframe's src attribute 
       const sources = $('iframe').map((i, element) => { 
        return element.attribs['src']; 
       }).get(); 

       // Resolve iframe sources 
       resolve(sources); 
       return; 
      } 

      // You can pass more error information here 
      reject('error loading url for iframe sources'); 
     }); 
    }); 
} 

而且我们可以使用这个功能,像这样:

iframes('http://www.w3schools.com/html/html_iframe.asp') 
    .then(srcs => { 
     // Can access the sources 
     console.log(srcs); 
    }) 
    .catch(err => console.log(err)); 
+0

我会在几分钟内测试它,非常感谢努力!真的很感谢 –

+0

嘿,它就像一个魅力!如果您不介意,我还有其他问题要跟进!正如你所说,我已经从函数iframe中提取了srcs,现在我试图用ejs来显示它们。所以我会认为他们是可用的。我只是调用渲染(toBeDisplayed.html.ejs),但它仍然表示该变量是未定义的。尝试删除var等但仍然没有运气.. –

+0

当我试图调试它,我得到奇怪的结果为以及.. console.log('之前渲染delLater:'+链接[0]); < - links [0]被定义为 res.render('delLater.html.ejs'); console.log('render:'+ link [0]); < - 引用错误 –