我正在构建一个示例测试刮板,以了解有关Cheerio和jQuery的信息。
在收到一组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);
});
}
}
});
似乎在从页面中分配标题时,我在某处获得了undefined的属性。
我必须提到我是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,但该错误指向第二个要求中的回调函数。
关于如何解决此问题的任何建议?
返回的网址之一如下所示
/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);
}
});
}
运行该命令,您将看到在几个URL之后,您会遇到一个“ 502错误的网关”,现在您必须处理该问题,并且可能还要处理许多其他事情,因为不能保证Reddit上发布的所有糟糕的链接都可以正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句