提问人:Wladek Surala 提问时间:4/13/2017 更新时间:4/13/2017 访问量:8975
如何使用选择器过滤“每个”中的 Cheerio 对象?
how to filter cheerio objects in `each` with selector?
问:
我正在使用 Cheerio 解析一个简单的网页,如果可能的话,我正在徘徊:
使用此结构的 html:
<tr class="human">
<td class="event"><a>event1</a></td>
<td class="name">name1</td>
<td class="surname"><a>surname1</a></td>
<td class="date">2011</td>
</tr>
<tr class="human">
<td class="event"><a>event2</a></td>
<td class="name">name2</td>
<td class="surname"><a>surname2</a></td>
<td class="date">2012</td>
</tr>
<tr class="human">
<td class="event"><a>event3</a></td>
<td class="name">name3</td>
<td class="surname"><a>surname3</a></td>
<td class="date">2013</td>
</tr>
一旦我获得了与选择器匹配的所有 cheerio 对象,我希望能够遍历它们以将类等中的值映射到对象。tr.human
name
surname
到目前为止,我做到了这一点:
var cheerio = require('cheerio');
var fs = require('fs')
fs.readFile('./humans.html', 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
const $ = cheerio.load(data)
var results = $('tr.human')
results.each(function(i, result){
var date = result.children[3]
var name = result.children[1]
var surname = result.children[2]
var object = {"name":name,"date":date,"surname":surname}
})
});
但是我想摆脱对索引的调用,而是想按选择器进行过滤,如下所示:children
result
var date = result.children('td.date')
但上述会导致以下错误:
var date = result.children('td.date')
^
TypeError: result.children is not a function
我是 node 和 cheerio 的新手,阅读了 Cheerio 文档,但我对这个很不满意。如何使用选择器获取某些类下的值?
我必须承认,我希望首先遍历元素和每个迭代映射中的对象,而不是匹配选择器,然后循环,因为这可能不能保证匹配结果中元素的正确顺序(循环和过滤器在这里不是交换的),或者它确实如此?
答:
6赞
Joseph
4/13/2017
#1
result
是一个裸露的元素,没有被 cheerio 包裹。与 jQuery 类似,您可能希望再次将其包装在$()
var date = $(result).children('td.date');
评论
0赞
Wladek Surala
4/13/2017
使用这种方法,我得到了非常奇怪的结果,并成为相当通用的对象,而没有其他所有(,)都具有的属性。但我会阅读更多关于在 jQuery 中包装/解包的信息,+1,谢谢:)date
name
surname
评论