使用HtmlAgilityPack从html页面获取节点

时间:2016-12-03 14:34:03

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

我的程序收集有关Steam用户的信息'个人资料(如游戏,徽章等)。
我使用HtmlAgilityPack从html页面收集数据,到目前为止它对我有用。

问题是在某些页面上它运行良好,但在某些页面上 - 返回null节点或抛出异常

  

对象引用未设置为对象的实例

这是一个例子。

这部分效果很好(当我获得徽章时):

        WebClient client = new WebClient();
        string html = client.DownloadString("http://steamcommunity.com/profiles/*id*/badges/");

        var doc = new HtmlDocument();
        doc.LoadHtml(html);

        HtmlNodeCollection div = doc.DocumentNode.SelectNodes("//div[@class=\"badge_row is_link\"]");

这会返回精确的徽章,然后我可以随心所欲地做任何事情。

但是在这个中我做了完全相同的事情(但得到了游戏),不知怎的,它一直在抛弃我和上面提到的错误:

        WebClient client = new WebClient();
        string html = client.DownloadString("http://steamcommunity.com/profiles/*id*/games/?tab=all");

        var doc = new HtmlDocument();
        doc.LoadHtml(html);

        HtmlNodeCollection div = doc.DocumentNode.SelectNodes("//*[@id='game_33120']");

我知道页面上有节点(通过谷歌浏览器代码视图查看),我不知道为什么在第一种情况下它起作用,但在第二种情况下它没有。

2 个答案:

答案 0 :(得分:0)

当您右键点击页面并选择查看来源时,您是否仍然会看到一个ID =' game_33120&#39 ;?的元素我的猜测是你赢了。我的猜测是页面是动态构建的,客户端。因此,请求中包含的HTML不包含您正在查找的元素。相反,一旦Javascript代码在浏览器中运行,该元素就会出现。

原始请求似乎有一段Javascript,其中包含一个名为rgGames的变量,它是将在屏幕上呈现的游戏的Javascript数组。您应该能够从中提取信息。

答案 1 :(得分:0)

我不理解带有此参数的selectNodes方法“// * [@ id ='game_33120']”,也许这是你的错,但你可以检查一下:

  1. steamprofil与批次等的真正联系是:
  2.   

    http://steamcommunity.com/id/ ID /徽章/

    而不是

      

    http://steamcommunity.com/profiles/ ID /徽章/

    1. 在我访问徽章页面后,网址停留在浏览器中,在游戏链接中,他们会将您重定向到
    2.   

      http:// steamcommunity。 COM

      也许这可以帮到你