Nokogiriにはノードの深さを知るメソッドがない
需要がないのかもしれませんが、DOMツリー上でのあるノードの根ノード(HTMLなら<html>
あるいは<body>
要素)からの深さを調べたいと思いました。
Nokogiriのドキュメントを探しましたが、よしなにやってくれそうな関数が見つかりませんでした。
従って独自にメソッドを作ってみました。
# HTMLドキュメントを読み込む
html = <<EOS
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p></p>
<p>
<div>
<span id="hello">hello</span>
</div>
</p>
<p></p>
</body>
</html>
EOS
# id="hello"のノードの深さを知る場合
node = Nokogiri::HTML(html).css("#hello")[0]
parent = node.parent
depth = 1
while parent && parent.name != "body" # bodyを根ノードにする
parent = parent.parent
depth += 1
end
puts depth
要領としては、ひたすら親をたどっていき、親が特定のノードにマッチしたら終了させます。
単純すぎる解決方法ですが自分用にメモ。