我需要为父节点解析所有子节点,但是子节点与父节点具有相同的名称:
<div>
<img></img>
<div>
<img></img>
</div>
<img></img>
</div>
我将 Nokogiri 与 Ruby 一起使用,但是当我children()
从第一个 div 节点开始时,解析会在第一个div
标签处过早结束。对此有任何解决方法吗?
假设您有一个起始节点并且想要所有具有相同名称的子节点,这里有一些辅助方法的选项:
# Using Ruby to Filter
def same_kind_children(node)
node.element_children.select{ |n| n.name==node.name }
end
# Using XPath to Filter
def same_kind_children(node)
node.xpath(node.name)
end
# Descendants instead of Children
def same_kind_descendants(node)
node.xpath(".//#{node.name}")
end
如果您有一种特定类型的节点,并且想要找到该类型的每个节点具有相同类型的父节点:
divs_in_divs = doc.xpath('div/div')
虽然看起来不太可能,但如果您没有记住特定的起始节点或节点名称,但想要找到与其父节点同名的所有节点,您可以这样做:
same_kind_nested = doc.xpath('//*').select{ |node| node.name==node.parent.name }
我几乎不想这么说,但这听起来像是遍历的另一个好案例:
require 'nokogiri'
html = <<EOF
<div>
<img></img>
<div>
<img></img>
</div>
<img></img>
</div>
EOF
doc = Nokogiri::HTML html
doc.root.traverse do |node|
if node.parent.name == node.name
puts node
end
end