订购HtmlNodes基于它们在HTML页面上的位置(C#/ XPath)

时间:2012-11-19 13:55:00

标签: c# html xpath html-agility-pack

上下文

我正在解析this service上的查询结果,但带有结果的HTML很乱。

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

目前只有一种方法可以解决它。

解析逻辑:

  1. 选择所有属性节点
  2. 选择所有值节点
  3. 在构建关键值对的每个集合上匹配其“索引”
  4. 例如:具有值[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. 将所有节点放在一个Collection
    4. 根据Html中每个节点的位置对此Collection的节点进行排序(首先出现在HTML上的节点将位于列表的开头)
    5. 知道如何实现目标?

      HTML示例:

      您可以勾选here

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

      先谢谢

1 个答案:

答案 0 :(得分:3)

我刚刚找到了一个可以在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>();