首页 > 解决方案 > 使用 HTMLAgility Pack 解析网站时出现意外结果

问题描述

我处于需要在 C# 控制台应用程序中使用 HTML Agility Pack 解析页面信息的情况下,我有以下内容;

public static void ResultsData()
{
    const string url = "https://example.com";
    const string rowXPath = "//*[@class=\"result\"]";

    var web = new HtmlWeb();
    var doc = web.Load(url);

    HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes(rowXPath);
    for (int i = 0; i < nodes.Count; i++)
    {
        Console.WriteLine(nodes[i].InnerText);
    }
}

以上似乎返回了第二组结果,我无法弄清楚为什么?

我正在从脚本中解析信息:

<script>
var displayOrder = "ascending";
function NumberedOrder() {
if (displayOrder == "ascending")
{
document.getElementById("Order").innerHTML = "<span class=\"result\">1</span><span class=\"result\">2</span><span class=\"result\">3</span>";
document.getElementById("OrderButton").innerHTML = "Display ascending order";
displayOrder = "desc";
}
else
{
document.getElementById("Order").innerHTML = "<span class=\"result\">3</span><span class=\"result\">2</span><span class=\"result\">1</span>";
document.getElementById("OrderButton").innerHTML = "Display descending order";
displayOrder = "asc";
}
};
</script>

我希望得到以下结果:

1 2 3

我实际上得到了什么:

3 2 1

任何帮助将不胜感激,我查看了类似的线程,但没有一个帮助我实现我正在寻找的东西。

标签: c#console-applicationhtml-agility-pack

解决方案


也许由于某些模糊的实现原因,解析是从 EOF 到 BOF 执行的?

在哪种情况下,以下会产生预期的结果吗?

for (int i = nodes.Count - 1; i >= 0; i--)
{
  Console.WriteLine(nodes[i].InnerText);
}

此代码似乎不必要地复杂,但我没有看到您提供的信息有任何其他解决方法,当然除了更改 Agility Pack 的源代码并编译您自己的版本。我还没有立即找到一种方法来传递参数来DocumentNode.SelectNodes改变默认排序。


推荐阅读