我正在尝试使用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>
如果是的话,我可以使用什么机制来获得所需的结果?
感谢
答案 0 :(得分:1)
在第二种情况下,nextUntil返回一个空集,所以没有什么可以从“下一步”获得。
您可以在通话中添加“addBack”,以确保始终拥有一个对象。
let url = $(this).nextUntil('pre').addBack().next('pre').text().trim();