Как определить максимальное количество уровней тега в документе - PullRequest
0 голосов
/ 03 марта 2019

У меня есть HTML-документ, в котором я хочу найти максимальную глубину <ol>.Пример моего вопроса приведен в Picture here.

HTML:

<body>
    <nav id="abc" epub:type="abc">
        <ol>
            <li><a href="cover.xhtml">cover</a></li>
            <li><a href="review.xhtml">review</a></li>
            <li><a href="preface.xhtml">preface</a></li>
            <li><a href="ch00.xhtml">ch00</a></li>
            <li><a href="part01.xhtml">part01</a>
                <ol>
                    <li><a href="ch01.xhtml">ch01</a>
                        <ol>
                            <li><a href="ch01-01.xhtml">ch01-01</a></li>
                            <li><a href="ch01-02.xhtml">ch01-02</a></li>
                            <li><a href="ch01-03.xhtml">ch01-03</a></li>
                            <li><a href="ch01-04.xhtml">ch01-04</a></li>
                        </ol>
                    </li>
                </ol>
            </li>
        <ol>
    </nav>
</body>

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Это действительно HTML, а не XML:

doc = Nokogiri::HTML html_string
doc.search('ol').map{|ol| ol.ancestors('ol').length}.max
#=> 2
0 голосов
/ 24 мая 2019

На первый взгляд кажется, что это будет делать то, что вы хотите:

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 теги, хотя.Я подозреваю, что другие ответы имеют ту же проблему, но не проверяли их.

0 голосов
/ 03 марта 2019
ol_depth = []
Nokogiri::XML::Reader(File.open('toc.xhtml')).each do |node|
  ol_depth << node.depth if node.name == 'ol'
end

ol_depth.uniq.count #=> 3

Я использовал это имя файла из-за вашего изображения.

Кстати, ваши данные неверны (последние </ol> без косой черты)

...