【问题标题】:How to determine the maximum number of levels of a tag in a document如何确定文档中标签的最大级别数
【发布时间】:2019-07-25 00:04:15
【问题描述】:

我有一个 HTML 文档,我想在其中找到 <ol> 的最大深度。 中给出了我的问题示例。

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>

【问题讨论】:

  • 您遇到问题的代码是什么?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?请提供minimal reproducible example
  • 我们需要查看演示问题的最小代码,否则看起来您希望我们为您编写它,这是题外话。此外,不要使用屏幕截图来提供必要的测试数据。指向图像的链接总是会中断,从而导致对其他人毫无意义的问题。有关详细信息,请参阅“How to Ask”。

标签: ruby-on-rails ruby ruby-on-rails-4 nokogiri


【解决方案1】:
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

因为你的图片,我使用了这个文件名。

顺便说一句,您的数据有误(最后一个 &lt;/ol&gt; 没有斜线)

【讨论】:

  • 这并没有真正利用 Nokogiri 为代码带来的优势,因为它只是遍历文档的节点。在一个大文档中它会是低效的。
【解决方案2】:

这真的是 HTML,而不是 XML:

doc = Nokogiri::HTML html_string
doc.search('ol').map{|ol| ol.ancestors('ol').length}.max
#=> 2

【讨论】:

    【解决方案3】:

    快速浏览一下,它看起来就像你想要的那样:

    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 标记,这将分解。我怀疑其他答案有同样的问题,但没有测试它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2012-02-02
      • 1970-01-01
      • 2017-02-13
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多