親ノードのすべての子ノードを解析する必要がありますが、子ノードの名前は親と同じです。
<div>
<img></img>
<div>
<img></img>
</div>
<img></img>
</div>
RubyでNokogiriを使用していますchildren()
が、最初のdivノードから使用すると、最初の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 }