繁体   English   中英

使用HtmlAgilityPack从html页面获取节点

[英]Getting nodes from html page using HtmlAgilityPack

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

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

你调用的对象是空的

这是一个例子。

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

        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']");

我知道页面上有节点(通过google chrome代码视图检查),我不知道为什么在第一种情况下它起作用,但是在第二种情况下却不起作用。

当您右键单击页面并选择“查看源代码”时,您仍然看到id ='game_33120'的元素吗? 我的猜测是你不会。 我的猜测是该页面是在客户端动态构建的。 因此,请求中包含的HTML不包含您要查找的元素。 相反,一旦在浏览器中运行了Javascript代码,该元素就会出现。

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

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

  1. Steamprofil与批处理等的真正链接是:

http://steamcommunity.com/id/ id / badges /

并不是

http://steamcommunity.com/profiles/ id / badges /

  1. 当我访问徽章页面后,URL保留在浏览器中的游戏链接中,它们会将您重定向到

http:// steamcommunity。 COM

也许这可以帮助您

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM