c# - 根据 HTML 页面上的位置对 HtmlNode 进行排序 (C#/XPath)

标签 c# html xpath html-agility-pack

上下文:

我正在解析 this service 上的查询结果,但结果的 HTML 很困惑。

我的目标是构建一个“KeyValue”对,其中每个“属性和值”显示为该查询的结果。

目前我脑子里只有一种方法来解决这个问题。

解析逻辑:

  1. 选择所有属性节点
  2. 选择所有值节点
  3. 在每个集合上匹配其“索引”以构建键值对

例如:属性[0]和值[0] ->(在此服务中,这将是“CNPJ”和“12.272.084/0001-00”)。

问题:

即使我设法找到一个 XPath 表达式来获取所有属性节点:

attrNodes = htmlDoc.DocumentNode.SelectNodes ("//td[@bgcolor='#f1f1b1']/*/font[@face='Verdana']");

我也无法找到值节点,因为有不同类型的节点在由 Html 呈现时实际上看起来相同(例如“b”和“strong”)。

甚至有不同层次的节点阻止我在 XPath 上使用通配符(“*”)来解决它(例如单个标签或嵌套的两个标签)

我的目标:

  1. 编写 XPath 以到达具有值的节点的每个不同子集
  2. 将所有节点放入一个集合中
  3. 根据每个节点在 Html 中的位置对该 Collection 的节点进行排序(首先出现在 HTML 上的节点将位于列表的开头)

知道如何实现我的目标吗?

HTML 示例:

您可以给它一张支票 here

或通过在 CNPJ 文本框中输入:12272084000100 自行查询服务 并点击“Pesquisar”。之后,您只需点击文本“Companhia Eletrica de Alagoas”

提前致谢

最佳答案

我刚刚找到了一个属性,可以在 HtmlAgilityPack 的“HtmlNode”类中找到设法解决我的问题的框架。

根据this documentation关于 HtmlNode 类:

StreamPosition
Gets the stream position of this node in the document, relative to the start of the document. 

这是我的测试的输出,使用在同一 Html 页面中找到的表格列表(用于测试目的的表格)

// HtmlNodeCollection of Tables
tableNodes[0].StreamPosition
925
tableNodes[1].StreamPosition
1651
tableNodes[2].StreamPosition
2387

使用此 StreamPosition 作为参数来排序我的列表成功解决了我的问题。

List<HtmlNode> OrderedList = valueNodes.OrderBy ( node => node.StreamPosition ).ToList<HtmlNode>();

关于c# - 根据 HTML 页面上的位置对 HtmlNode 进行排序 (C#/XPath),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13455265/

相关文章:

c# - 如何有效地交叉引用 2 个文本文件? |改进我的代码

c# - JavaScript 替换汉字

html - 使用XPath从属性中选择URL

c# - Xml 节点的 Xml 后代

c# - 使 C# 代码在 .NET < 4 中后期绑定(bind)的侵入性最小的方法是什么?

c# - 从 RS232(com) 接收数据

php - 将通过 AJAX 上传到 DIV 的变量传递到同一个 DIV 中,并用结果替换内容

javascript - 如何在 HTML 中创建一个信息框来显示与悬停的 SVG 路径相关的信息?

javascript - 密码正则表达式验证?

xslt - 查找每两个处理指令之间的所有XML节点