如何确定文档中标签的最大层数
How to determine the maximum number of levels of a tag in a document
我有一个 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>
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>
没有斜线)
这真的是HTML,不是XML:
doc = Nokogiri::HTML html_string
doc.search('ol').map{|ol| ol.ancestors('ol').length}.max
#=> 2
快速浏览一下,这看起来就像您想要的那样:
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
节点,它将 return 触发更多 in-depth 搜索所有其他嵌套节点。
不过,如果文档中有多个部分包含嵌套的 ol
标签,这将无法解决。我怀疑其他答案也有同样的问题,但没有测试。
我有一个 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>
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>
没有斜线)
这真的是HTML,不是XML:
doc = Nokogiri::HTML html_string
doc.search('ol').map{|ol| ol.ancestors('ol').length}.max
#=> 2
快速浏览一下,这看起来就像您想要的那样:
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
节点,它将 return 触发更多 in-depth 搜索所有其他嵌套节点。
不过,如果文档中有多个部分包含嵌套的 ol
标签,这将无法解决。我怀疑其他答案也有同样的问题,但没有测试。