2

语境:

我正在解析此服务的查询结果,但结果的 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 中的位置对该集合的节点进行排序(在 HTML 中首先出现的节点将位于列表的开头)

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

HTML 示例:

你可以在这里检查一下

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

提前致谢

4

1 回答 1

4

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

根据有关 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>();
于 2012-11-19T14:15:15.737 回答