从request / cheerio中提取数据

时间:2016-03-08 16:04:48

标签: javascript node.js callback request cheerio

我目前正在开展一个项目,并对javascript / nodejs / request / 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只存在于上面的代码片段中,并且没有办法使它成为全局(不会介意)或以某种方式返回它。有任何想法吗?

1 个答案:

答案 0 :(得分:1)

使用Promise可以帮助我们轻松提取并随后使用异步加载的数据。在下面的代码片段中,我将您的逻辑包装到一个函数中,该函数返回一个解析必要数据的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));