12

問題

さまざまなURLに対していくつかの統計を実行しています。子の数が最も集中している最上位の要素を見つけたいと思います。私が従いたい方法は、すべてのトップレベルの要素を識別し、ページ上のすべての要素の何パーセントがそれに属しているかを判断することです。

ゴール

  • 特定の要素のすべての子を再帰的に取得します。

入力:ノコギリ要素

出力:ノコギリ要素の配列または子の総数の数

設定

  • Ruby 1.9.2
  • のこぎりの逸品

私が思いついたもの(これは機能しますが、以下で選択した答えほどきれいではありません)

getChildCount(elem)
    children = elem.children
    return 0 unless children and children.count > 0
    child_count = children.count
    children.each do |child|
        child_count += getChildCount(child)
    end
    child_count
end
4

2 に答える 2

30

トラバースメソッドは、現在のノードとすべての子を再帰的にブロックに生成します。

# if you would like it to be returned as an array, rather than each node being yielded to a block, you can do this
result = []
doc.traverse {|node| result << node }
result

# or, 
require 'enumerator'
result = doc.enum_for(:traverse).map
于 2012-04-09T18:19:52.757 に答える
9
# Non-recursive
class Nokogiri::XML::Node
  def descendant_elements
    xpath('.//*')
  end
end

# Recursive 1
class Nokogiri::XML::Node
  def descendant_elements
    element_children.map{ |kid|
      [kid, kid.descendant_elements]
    }.flatten
  end
end

# Recursive 2
class Nokogiri::XML::Node
  def descendant_elements
    kids = element_children.to_a
    kids.concat(kids.map(&:descendant_elements)).flatten
  end
end
于 2012-04-09T17:44:16.227 に答える