首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在HTML树中获取节点的深度?

如何在HTML树中获取节点的深度?
EN

Stack Overflow用户
提问于 2012-07-30 07:28:52
回答 3查看 1.5K关注 0票数 0

我使用HtmlAgilityPack解析和分析HTML页面,我需要知道每个节点的“深度”--距离Body节点的距离。示例(“深度”属性仅用于说明目的):

代码语言:javascript
复制
<html>
  <head></head>
  <body depth="0"> 
    <div depth="1">
      <ul depth="2">
        <li depth="3">
          <p depth="4">foo</p>
        </li>
        <li depth="3">
          <p depth="4">bar</p>
        </li>
      </ul>
    </div>
  </body>
</html>

我试图避免两个显而易见的解决方案:

  • 扫描HTML树(DFS、BFS等),计算每个节点的深度,并将值存储在字典或类似的目录中。
  • 通过计数node.ParentNode来计算每个节点的“按需”深度,直到到达body

是否有办法通过使用HtmlAgilityPack在Load上收集的现有数据来避免这种情况?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-30 07:33:04

您是在问是否有内置的NodeDepth属性或类似的东西?我很肯定答案是否定的,因为计算出库解析的每个节点都会产生很少需要的开销。由于计算节点深度很容易使用一些递归,所以我认为它们不会包括默认情况。

你为什么要回避显而易见的解决方案?

票数 1
EN

Stack Overflow用户

发布于 2012-07-30 14:53:31

据我所知,AgilityPack不存储节点的深度。

如果您想获得所有节点的深度,假设编写递归方法(例如从根节点开始,并通过递归调用当前节点子节点来增加深度)会更容易。

至于单个节点的深度计算,您可以使用HtmlNode.XPath属性,并计算这个值中的斜杠数(/)。这将是节点深度。在您的例子中,您应该首先计算<body>节点的深度,然后从欲望节点的深度减去这个值,以获得相对深度

代码语言:javascript
复制
var bodyDepth = doc.DocumentNode
    .SelectSingleNode("//body")
    .XPath
    .Count(c => c == '/');
var paragraphDepth = doc.DocumentNode
    .SelectSingleNode("//p")
    .XPath
    .Count(c => c == '/');
var result = paragraphDepth - bodyDepth;

这将为您提供4,但我不确定这是否比遍历ParentNode属性更容易。

票数 3
EN

Stack Overflow用户

发布于 2014-10-31 06:06:16

HtmlAgilityPack不会给出深度细节。我们可以使用上面提供的'/‘字符计数从XPath变量中获得它。我们不需要为了获取细节而遍历父母。

代码语言:javascript
复制
 foreach (HtmlNode rootNode in document.DocumentNode.Descendants())
            {
                levels.Add(rootNode.XPath.Count(x => x == '/'));
            }

应该管用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11717059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档