如何捕获p和ul标签而不用Nokogiri抓取ul的嵌套标签?

时间:2016-03-31 00:25:51

标签: html ruby xpath nokogiri

使用Nokogiri,我正在尝试获取所有“第一”级pul HTML标记并且遇到一些困难。

例如,这是我正在使用的HTML

<p><strong>Just testing <em>something</em> out&nbsp;</strong>over here.</p>
<p>Here's a paragraph that contains bullets though:</p>
<ul>
    <li>One thing here.
        <ul>
            <li>One more thing</li>
        </ul>
    </li>
    <li>Another thing here</li>
</ul>
<p>
    <br>
</p>
<ul>
    <li>nothing</li>
</ul>
<p>Some more text.</p>

我想抓住所有段落和所有无序列表。由于无序列表未被p标记包围,因此我必须使用以下示例来获取这些标记:

#data = the HTML above
html = Nokogiri::HTML(data)
html.xpath("//p | //ul").each do |p|
 # some code
end

问题是html.xpath("//p | //ul")的输出如下所示:

<p><strong>Just testing <em>something</em> out </strong>over here.</p>
<p>Here's a paragraph that contains bullets though:</p>
<ul>
    <li>One thing here.
        <ul>
            <li>One more thing</li>
        </ul>
    </li>
    <li>Another thing here</li>
</ul>
<ul>
    <li>One more thing</li>
</ul>
<p>
    <br>
</p>
<ul>
    <li>nothing</li>
</ul>
<p>Some more text.</p>

正如您在那里看到的那样,One more thing会重复,因为它是ul内嵌套的ul标记之一。因此,我的代码最终会对此文本执行两次相同的操作。

所以我正在寻找的是“排除”嵌套标签,如果它与父级相同,那么当我运行html.xpath("//p | //u")或类似的东西时,它会查看ul标签并且只是将它全部视为xpath输出数组中的一个元素

Nokogiri有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

您可以使用以下模式使用XPath选择特定名称的第一级元素:

//target_element[not(ancestor::target_element)]

因此,对于您的具体情况,XPath将如下:

//p[not(ancestor::p)] | //ul[not(ancestor::ul)]