2016-03-08 100 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]); < - 引用錯誤 –