На первый взгляд кажется, что это будет делать то, что вы хотите:
html = <<~EOT
<body>
<ol>
<li><a href="cover.xhtml">cover</a></li>
<ol>
<li><a href="ch01.xhtml">ch01</a>
<ol>
<li><a href="ch01-01.xhtml">ch01-01</a></li>
</ol>
</li>
</ol>
</li>
</ol>
</body>
EOT
require 'nokogiri'
doc = Nokogiri::HTML(html)
ol_depth = doc.at('ol') ? doc.search('ol ol').size + 1 : 0
ol_depth # => 3
Он использует CSS, чтобы находить теги внутри тегов через ol ol
.Если at('ol')
найдет узел ol
, он вернет его, запустив более углубленный поиск всех других вложенных узлов.
Это сломается, если в документе есть несколько разделов, содержащих вложенныеol
теги, хотя.Я подозреваю, что другие ответы имеют ту же проблему, но не проверяли их.