如何使用 cheerio 立即获得 child 的 <ul>

How to get immediate child of <ul> using cheerio

我有 html 文件 html 内容如下:

<ul>
    <li class="class_1">111</li>
    <li class="class_2">
        <ul>
            <li class="class_3">222</li>
            <li class="class_4">333</li>
        </ul>    
    </li>
    <li class="class_5">444</li>
</ul> 

在 cheerio 模块中加载 html 内容后搜索即时 li childs 它正在来自 child ul 的所有项目以及像这样:

this._$$=cheerio.load(<htmlContent>, {xmlMode : true});
const liElements = this._$$(`ul > *`);

当我在转换为 html 内容后打印 liElements 时,我得到这样的输出:

<li class="class_1">111</li>
<li class="class_2">
     <ol>
         <li class="class_3">222</li>
         <li class="class_4">333</li>
     </ol>    
</li>
<li class="class_5">444</li>
<li class="class_3">222</li>
<li class="class_4">333</li>

您可以看到来自 child 的内容 ul 在这里重复。我尝试了 cheerio 文档中的很多选项,但没有成功。任何人都可以帮助我立即获得 li child of ul .

非常感谢。

问题是 ul > * 太笼统了,它会 return 所有 ul child 甚至是 li 标签下的 ul

也许您有两种解决方案来解决这种情况

1) 在 ul

上面放一个 class 名字
<ul class="main-ul">
    <li class="class_1">111</li>
    <li class="class_2">
        <ul>
            <li class="class_3">222</li>
            <li class="class_4">333</li>
        </ul>    
    </li>
    <li class="class_5">444</li>
</ul> 

selector 变成了 const liElements = this._$$(.main-ul > li);

2) 在 li 标签中获取 ul 的 child 并将它们从所有 child

的列表中删除
const liWithLiParent= this._$$(`li > ul > *`);
const liElements = this._$$(`ul > *`).filter(li => !liWithLiParent.some(liWithParent => liWithParent === li));

最简单的就是删除子 ul 的

$('ul ul').remove()