如何使用Nokogiri仅选择叶子节点?

Luc*_*cas 4 ruby xpath nokogiri

我正在寻找有关如何完成操作的建议。我正在尝试仅使用xpath的解决方案:

一个html示例:

<div>
  <div>
    <div>text div (leaf)</div>
    <p>text paragraph (leaf)</p>
  </div>
</div>
<p>text paragraph 2 (leaf)</p>
Run Code Online (Sandbox Code Playgroud)

码:

doc = Nokogiri::HTML.fragment("- the html above -")
result = doc.xpath("*[not(child::*)]")


[#<Nokogiri::XML::Element:0x3febf50f9328 name="p" children=[#<Nokogiri::XML::Text:0x3febf519b718 "text paragraph 2 (leaf)">]>] 
Run Code Online (Sandbox Code Playgroud)

但是这个xpath只给我最后一个“ p”。我想要的是一个扁平行为,只返回叶节点。

以下是stackoverflow中的一些参考答案:

如何使用XPath表达式选择所有叶节点?

XPath-获取没有特定类型的子节点的节点

谢谢

Jus*_* Ko 6

您可以使用以下命令找到所有没有子元素的元素节点:

//*[not(*)]
Run Code Online (Sandbox Code Playgroud)

例:

require 'nokogiri'

doc = Nokogiri::HTML.parse <<-end
<div>
  <div>
    <div>text div (leaf)</div>
    <p>text paragraph (leaf)</p>
  </div>
</div>
<p>text paragraph 2 (leaf)</p>
end

puts doc.xpath('//*[not(*)]').length
#=> 3

doc.xpath('//*[not(*)]').each do |e|
    puts e.text
end
#=> "text div (leaf)"
#=> "text paragraph (leaf)"
#=> "text paragraph 2 (leaf)"
Run Code Online (Sandbox Code Playgroud)