P粉7295188062023-09-06 09:17:49
TLDR:
HtmlWeb
解压响应(或使用合适的HTTP客户端)显然,SelectSingleNode()
调用返回null
,因为它找不到节点。
在这种情况下,检查加载的HTML是有帮助的。你可以通过获取htmlDoc.DocumentNode.InnerHtml
的值来做到这一点。我尝试过这样做,生成的“HTML”是无意义的。
原因是HtmlWeb
默认不解压它收到的响应。有关详细信息,请参见此github问题。如果你使用了一个合适的HTTP客户端(像这个),或者如果HtmlAgilityPack开发人员更加积极,我认为你不会遇到这个问题。
如果你坚持使用HtmlWeb
,你的代码应该如下所示:
const string html = @"https://coinmarketcap.com/currencies/bitcoin/"; var web = new HtmlWeb { AutomaticDecompression = DecompressionMethods.GZip }; HtmlDocument doc = web.Load(html); HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='priceValue ']/span");
请注意,你要查找的元素的类实际上是priceValue
(末尾有一个空格字符),页面中还有另一个类为priceValue
的div
。不过,这是另一个问题,你应该最终能够找到一个更健壮的选择器。也许可以尝试这样:
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[contains(@class, 'priceSection')]//div[contains(@class, 'priceValue')]/span");