上下文:
我正在解析 this service 上的查询结果,但结果的 HTML 很困惑。
我的目标是构建一个“KeyValue”对,其中每个“属性和值”显示为该查询的结果。
目前我脑子里只有一种方法来解决这个问题。
解析逻辑:
- 选择所有属性节点
- 选择所有值节点
- 在每个集合上匹配其“索引”以构建键值对
例如:属性[0]和值[0] ->(在此服务中,这将是“CNPJ”和“12.272.084/0001-00”)。
问题:
即使我设法找到一个 XPath 表达式来获取所有属性节点:
attrNodes = htmlDoc.DocumentNode.SelectNodes ("//td[@bgcolor='#f1f1b1']/*/font[@face='Verdana']");
我也无法找到值节点,因为有不同类型的节点在由 Html 呈现时实际上看起来相同(例如“b”和“strong”)。
甚至有不同层次的节点阻止我在 XPath 上使用通配符(“*”)来解决它(例如单个标签或嵌套的两个标签)
我的目标:
- 编写 XPath 以到达具有值的节点的每个不同子集
- 将所有节点放入一个集合中
- 根据每个节点在 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/