0

親ノードのすべての子ノードを解析する必要がありますが、子ノードの名前は親と同じです。

<div>
  <img></img>
  <div>
    <img></img>
  </div>
  <img></img>
</div>

RubyでNokogiriを使用していますchildren()が、最初のdivノードから使用すると、最初のdivタグで解析が途中で終了します。これに対する回避策はありますか?

4

2 に答える 2

1

私はそれを言うのがほとんど嫌いですが、トラバースの別の良いケースのように思えます:

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
于 2012-06-02T13:04:48.190 に答える
1

開始ノードがあり、同じ名前を持つすべての子ノードが必要であると仮定すると、ヘルパー メソッドのオプションがいくつかあります。

# 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 }
于 2012-06-02T13:31:09.827 に答える