困惑于cheerio nextUntil

时间:2017-05-15 21:03:38

标签: cheerio

我正在尝试使用cheerio解析一些html,并且对于一组标签,cheerio.nextUntil()似乎按预期工作,但对于另一组,它不会

这是代码

(function () {
    const cheerio = require('cheerio');

    const html = `
        <h2>Reset spent time for an issue</h2>
        <p>Resets the total spent time for this issue to 0 seconds.</p>
        <pre><code>POST /projects/:id/issues/:issue_iid/reset_spent_time
        </code></pre>

        <h2>Get time tracking stats</h2>
        <pre><code>GET /projects/:id/issues/:issue_iid/time_stats
        </code></pre>`;


        let $ = cheerio.load(html);

        $('h2').each(function(index,element) {
            let name = $(this).text();
            let description = $(this).next('p').text();

            let url = $(this).nextUntil('pre').next('pre').text().trim();

            console.log({
                name,
                description,
                url
            });
        });
})();

我得到的结果是

{ name: 'Reset spent time for an issue',
  description: 'Resets the total spent time for this issue to 0 seconds.',
  url: 'POST /projects/:id/issues/:issue_iid/reset_spent_time' }
{ name: 'Get time tracking stats', description: '', url: '' }

我希望第二个description为&#39;&#39;,但不要理解第二个网址为空的原因

如果我将代码更改为

        let url = $(this).nextUntil('pre').next('pre').text().trim();
        let foo = $(this).next().text();

        console.log({
            name,
            description,
            url,
            foo
        });

我得到了

{ name: 'Get time tracking stats',
  description: '',
  url: '',
  foo: 'GET /projects/:id/issues/:issue_iid/time_stats\n        ' }

所以,foo是我的预期

nextUntil()执行此操作

  

获取以下所有兄弟姐妹但不包括该元素   由选择器匹配,可选择由另一个选择器过滤。

所以,因为它说&#34;跟随兄弟姐妹,但不是匹配的元素&#34;并且下一个兄弟匹配的元素,所以它不匹配它,并且它不包括在内,那么next()然后不起作用?< / p>

如果是的话,我可以使用什么机制来获得所需的结果?

感谢

1 个答案:

答案 0 :(得分:1)

在第二种情况下,nextUntil返回一个空集,所以没有什么可以从“下一步”获得。

您可以在通话中添加“addBack”,以确保始终拥有一个对象。

let url = $(this).nextUntil('pre').addBack().next('pre').text().trim();