javascript 无法读取未定义的属性“父” - Node.js
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27749515/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Cannot read property 'parent' of undefined - Node.js
提问by Xie Zhijie
I was trying to employ superagent and cheerio to crawl data from kijiji for learning, while I got an error of "Cannot read property 'parent' of undefined". (I tried craigslist which was fine). It happened after I got the correct results "object". It seems something wrong with cheerio. Does anyone have any idea about this? Appreciate for your help in advance.
我试图使用 superagent 和cheerio 从 kijiji 抓取数据进行学习,但出现“无法读取未定义的属性‘父’”的错误。(我试过 craigslist 这很好)。它发生在我得到正确的结果“对象”之后。Cheerio 好像有点问题。有没有人对此有任何想法?提前感谢您的帮助。
[ERROR] 17:30:24 TypeError
TypeError: Cannot read property 'parent' of undefined
at Function.exports.update (C:\Users\zhi_xie\nodejs\neomovie\node_modules\ch
eerio\lib\parse.js:55:25)
at module.exports (C:\Users\zhi_xie\nodejs\neomovie\node_modules\cheerio\lib
\parse.js:17:11)
at Function.exports.load (C:\Users\zhi_xie\nodejs\neomovie\node_modules\chee
rio\lib\static.js:19:14)
at C:\Users\zhi_xie\nodejs\neomovie\routes\crawlerusers.js:35:27
at Request.callback (C:\Users\zhi_xie\nodejs\neomovie\node_modules\superagen
t\lib\node\index.js:746:30)
at Request.<anonymous> (C:\Users\zhi_xie\nodejs\neomovie\node_modules\supera
gent\lib\node\index.js:135:10)
at Request.emit (events.js:95:17)
at ClientRequest.<anonymous> (C:\Users\zhi_xie\nodejs\neomovie\node_modules\
superagent\lib\node\index.js:921:12)
at ClientRequest.emit (events.js:95:17)
at HTTPParser.parserOnIncomingClient [as onIncoming] (http.js:1692:21)
Here is the codes:
这是代码:
var superagent = require('superagent');
var cheerio = require('cheerio');
var url = require('url');
var kijijiUrl = 'http://www.kijiji.ca/b-immobilier/ville-de-montreal/c34l1700281?ad=wanted';
superagent.get(kijijiUrl).end(function (err, res) {
if (err) {
return console.error(err);
}
var topicUrls = [];
var $ = cheerio.load(res.text);
// get all links in that page
$('div.container-results').children('table').each(function (idx, element) {
var $element = $(element);
var href = url.resolve(kijijiUrl, $element.attr('data-vip-url'));
topicUrls.push(href);
});
for(i = 0; i<topicUrls.length; i++){
superagent.get(topicUrls[i])
.end(function (err, sres) {
//normal err handler
if (err) {
return next(err);
}
var $ = cheerio.load(sres.text);
var object = {};
$('table.ad-attributes').find('tr').not('.divider').each(function(i, element){
var titles = $(element).children('th').text().trim();
var values = $(element).children('td').text().trim();
object[titles] = values;
});
console.log(object);
});
}
})
回答by Luca Steeb
As chrki already said, cheerio.load()
is called with an empty value like null or an empty string. Check whether the value contains something before you call .load()
:
正如 chrki 已经说过的,cheerio.load()
使用空值(如 null 或空字符串)调用。在调用之前检查该值是否包含某些内容.load()
:
if (res.text) {
var $ = cheerio.load(res.text);
} else {
// do something else
}
回答by moonweazel
I had the same error message as
我有相同的错误信息
$ = cheerio.load(response.Body);
should have been
本来应该
$ = cheerio.load(response.body);
so there was nothing for cheerio to load.
所以cheerio没有什么可以加载的。