【发布时间】:2014-12-18 09:59:49
【问题描述】:
我正在使用 node.js 编写一个爬虫来学习,并爬取数据以供将来使用。我知道如何抓取页面中的单个元素,但是经过一整天的研究,我无法弄清楚如何获取可变子元素的值。
这是我要抓取的 HTML 部分。 'attrgroup' 的每个子元素都有不同的
<p class="attrgroup">
<span><b>4</b>BR / <b>1</b>Ba</span>
<span><b>1200</b>ft<sup>2</sup></span>
<span>duplex</span>
<span>laundry on site</span>
<span>street parking</span>
<br><span>cats are OK - purrr</span></p>
这是我的代码
topics = topics.map(function (topicPair) {
var topicUrl = topicPair[0];
var topicHtml = topicPair[1];
var $ = cheerio.load(topicHtml);
return ({
//[1]I got correct value,such as duplex, using following clauses.
att1: $('.attrgroup').children().eq(0).text().trim(),
att2: $('.attrgroup').children().eq(1).text().trim(),
att3: $('.attrgroup').children().eq(2).text().trim(),
//[2]I want all of them,but.each function doesn't return the correct data
atts: $('.attrgroup').children().each(function(){
$(this).text()
}),
});
});
我得到这样的结果:
att1: '4BR / 1Ba',
att2: '1200ft2',
att3: 'duplex'
atts: { '0': [Object],
'1': [Object],
'2': [Object],
'3': [Object],
'4': [Object],
'5': [Object],
options: [Object],
_root: [Object],
length: 7,
prevObject: [Object] },
目前,我知道原因可能是 $(this),一个 jquery 对象。我试图将它转换为 DOM 对象,但也不起作用。 任何人都可以帮助我纠正我的那部分代码,或者告诉我如何修复它。它不必使用每种方法,任何方法都可以使用。或者提示也会有很大帮助。提前致谢!
【问题讨论】:
-
你应该写一个recursive function来遍历DOM树并提取文本内容。
-
通过查看您的代码,您希望每个函数做什么? $.each 迭代匹配的集合并返回可链接的集合。我猜你想做
Array.prototype.reduce.call($('.attrgroup').children(), function (prev,cur) {return prev + $(cur).text()}, "");之类的事情,请参阅Array.prototype.reduce MDN doc,或者只使用Array.prototype.map -
我想返回 attrgroups 的所有子元素,而这些 attrgroups 有不同数量的子元素。我真的不知道如何使用你提到的方法。反正现在已经解决了。感谢您的帮助
标签: javascript jquery html node.js