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

一旦我获得了所有与tr.human选择器匹配的cheerio对象,我就希望能够遍历它们,以将namesurname等类中的值映射到一个对象。

到目前为止,我实现了这一点:
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中的index的调用,相反,我想通过选择器来过滤result,如下所示:
var date = result.children('td.date')

但以上结果导致以下错误:
var date = result.children('td.date')
                          ^
TypeError: result.children is not a function

我是Node和cheerio的新手,请阅读Cheerio文档,但我对此非常满意。如何使用选择器获取某些类下的值?

我必须承认,我想要首先循环遍历元素,并在每个迭代映射内部映射到对象,不匹配选择器,然后循环,因为这可能无法保证匹配结果中元素的正确顺序(此处的循环和过滤器不可互换) ,或者呢?

最佳答案

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

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

关于javascript - 如何使用选择器过滤 `each`中的cheerio对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43381891/

10-11 08:21