2016-08-20 139 views
0

我構建了一個樣本測試刮板來了解Cheerio和jQuery。Cheerio Node.JS外部標題鏈接問題

我在收到一組URL並存儲它們之後,在第二個請求上撓頭,是要做另一個請求來加載這些URL並從該頁面的標題中提取標題。

我的代碼看起來像這樣。

var request = require('request'), 
    cheerio = require('cheerio'); 
    urls = []; 
    titles = []; 
request('http://reddit.com', function(err, resp, body){ 
if(!err && resp.statusCode == 200){ 
var $ = cheerio.load(body); 

    $('a.title', '#siteTable').each(function(){ 
    var url = $(this).attr('href'); 
    urls.push(url); 
}); 
    //issue is here 
    for(var i = 0; i < urls.length; i++){ 
    request(urls[i], function(err, resp, body){ 
    var $ = cheerio.load(body); 

    var title = $("title").text(); 

    console.log(title); 
    }); 
    } 
    } 
}); 

看來,當從頁面歸屬標題時,我會得到某處未定義的屬性。

我必須提到我是jQuery的新手,所以這段代碼可能看起來很荒謬(我假設)。

我從控制檯收到的錯誤是,

TypeError: Cannot read property 'parent' of undefined 
    at Function.exports.update (/home/pi/node_modules/cheerio/lib/parse.js:55:25) 
    at module.exports (/home/pi/node_modules/cheerio/lib/parse.js:17:11) 
    at Function.exports.load (/home/pi/node_modules/cheerio/lib/static.js:19:14) 
    at Request._callback (/home/pi/scraper.js:16:22) 
    at self.callback (/home/pi/node_modules/request/request.js:187:22) 
    at Request.emit (events.js:95:17) 
    at Request.init (/home/pi/node_modules/request/request.js:275:17) 
    at new Request (/home/pi/node_modules/request/request.js:129:8) 
    at request (/home/pi/node_modules/request/index.js:55:10) 
    at Request._callback (/home/pi/scraper.js:15:6) 

我明白,這個錯誤意味着,我有一個變量不確定,我試圖讓次級屬性類似.someThing但錯誤點第二次請求中的回調函數。

有關如何解決此問題的任何建議?

+0

請注意,許多變量都是全局變量,因爲您在第二個變量定義之後使用了分號而不是逗號。 – adeneo

回答

1

一個URL的返回這個樣子的

/r/Jokes/comments/4yp0ex/mom_dont_freak_out_but_im_in_the_hospital/ 

有可能是別人的,但看着reddit的人們可以清楚地看到錨,並在href

<a class="title may-blank " href="/r/Jokes/comments/4yp0ex/mom_dont_freak_out_but_im_in_the_hospital/" tabindex="1" rel="">"Mom? Don't freak out, but I'm in the hospital..."</a> 

當然,試圖使用請求獲取沒有協議或域的URL,失敗,並且一切崩潰。

你必須加入域和創建絕對URL的處理內部鏈接,一個簡單的方法來做到這一點會是這樣的

for (var i = 0; i < urls.length; i++) { 
    var uri = (/^(f|ht)tps?:\/\//i.test(urls[i]) ? "" : "https://www.reddit.com") + urls[i]; 

    request(uri, function(err, resp, body) { 
    if (err) { 
     // handle errors 
    } else { 
     var $ = cheerio.load(body); 
     var title = $("title").text(); 

     console.log(title); 
    } 
    }); 
} 

運行,你會看到,經過幾個網址,你遇到一個「502壞門戶」,現在你必須處理這個,也許還有很多其他的事情,因爲並不能保證Reddit上發佈的所有糟糕的鏈接實際上都是有效的。