如何使用选择器过滤“每个”中的 Cheerio 对象?

how to filter cheerio objects in `each` with selector?

提问人:Wladek Surala 提问时间:4/13/2017 更新时间:4/13/2017 访问量:8975

问:

我正在使用 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.humannamesurname

到目前为止,我做到了这一点:

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}
   })
});

但是我想摆脱对索引的调用,而是想按选择器进行过滤,如下所示:childrenresult

var date = result.children('td.date')

但上述会导致以下错误:

var date = result.children('td.date')
                          ^
TypeError: result.children is not a function

我是 node 和 cheerio 的新手,阅读了 Cheerio 文档,但我对这个很不满意。如何使用选择器获取某些类下的值?

我必须承认,我希望首先遍历元素和每个迭代映射中的对象,而不是匹配选择器,然后循环,因为这可能不能保证匹配结果中元素的正确顺序(循环和过滤器在这里不是交换的),或者它确实如此?

JavaScript jQuery 节点 .js HTML 解析 Cheerio

评论


答:

6赞 Joseph 4/13/2017 #1

result是一个裸露的元素,没有被 cheerio 包裹。与 jQuery 类似,您可能希望再次将其包装在$()

var date = $(result).children('td.date');

评论

0赞 Wladek Surala 4/13/2017
使用这种方法,我得到了非常奇怪的结果,并成为相当通用的对象,而没有其他所有(,)都具有的属性。但我会阅读更多关于在 jQuery 中包装/解包的信息,+1,谢谢:)datenamesurname