我需要分析所有的子节点的父节点,但子节点具有相同的名称作为父:获取子节点具有相同的名称作为父
<div>
<img></img>
<div>
<img></img>
</div>
<img></img>
</div>
我使用的是引入nokogiri使用Ruby,但是当我从第一个div节点执行children()
时,解析过早地在第一个div
标记处结束。对此的任何解决方法?
我需要分析所有的子节点的父节点,但子节点具有相同的名称作为父:获取子节点具有相同的名称作为父
<div>
<img></img>
<div>
<img></img>
</div>
<img></img>
</div>
我使用的是引入nokogiri使用Ruby,但是当我从第一个div节点执行children()
时,解析过早地在第一个div
标记处结束。对此的任何解决方法?
我几乎讨厌这样说,但它听起来像另一个很好的理由遍历:
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
假设你有一个起始节点,并希望有相同名称的所有子节点,这里有一些选择为辅助方法:
# 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 }
您能否请您展示一些Ruby代码或您正在使用的xpath选择器以及您的执行预期。 – Andrew
看起来像一个简单的CSS(node.css(“div”)')或XPath('node.xpath(“.// div”)')选择器应该做的伎俩。 – d11wtq
我不明白你想要从你给出的示例XML和你描述的内容。这里只有两种类型的节点 - “div”和“img” - 既不适合您的描述。 'img'节点没有孩子,所以他们不在。顶部'div'确实有一个孩子'div',但是你说“解析过早地在第一个div处结束”......但只有一个“div”。 – Phrogz