2016-03-08 9 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 живет только в вышеупомянутом фрагменте кода, и нет никакого способа сделать его глобальным (не против) или каким-то образом вернуть его. Есть идеи?

+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

Эй, это работает как шарм! У меня есть еще один вопрос, чтобы следить, если вы не возражаете! Я извлек srcs из iframe функции, как вы сказали, и теперь я пытаюсь отобразить их с помощью ejs. Поэтому я предполагаю, что они будут доступны. Я просто вызываю render (toBeDisplayed.html.ejs), но он все еще говорит, что переменная не определена. Пробовал с отсутствием var и т. Д., Но все равно не повезло. –

+0

Когда я пытаюсь отладить его, я получаю странные результаты как хорошо .. console.log ('pre render delLater:' + links [0]); <- ссылки [0] определены res.render ('delLater.html.ejs'); console.log ('after render:' + link [0]); <- контрольная ошибка –

Смежные вопросы