TLDR:
HtmlWeb
解壓響應(yīng)(或使用合適的HTTP客戶端)顯然,SelectSingleNode()
調(diào)用返回null
,因?yàn)樗也坏焦?jié)點(diǎn)。
在這種情況下,檢查加載的HTML是有幫助的。你可以通過獲取htmlDoc.DocumentNode.InnerHtml
的值來做到這一點(diǎn)。我嘗試過這樣做,生成的“HTML”是無意義的。
原因是HtmlWeb
默認(rèn)不解壓它收到的響應(yīng)。有關(guān)詳細(xì)信息,請(qǐng)參見此github問題。如果你使用了一個(gè)合適的HTTP客戶端(像這個(gè)),或者如果HtmlAgilityPack開發(fā)人員更加積極,我認(rèn)為你不會(huì)遇到這個(gè)問題。
如果你堅(jiān)持使用HtmlWeb
,你的代碼應(yīng)該如下所示:
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("http://div[@class='priceValue ']/span");
請(qǐng)注意,你要查找的元素的類實(shí)際上是priceValue
(末尾有一個(gè)空格字符),頁面中還有另一個(gè)類為priceValue
的div
。不過,這是另一個(gè)問題,你應(yīng)該最終能夠找到一個(gè)更健壯的選擇器。也許可以嘗試這樣:
HtmlNode node = doc.DocumentNode.SelectSingleNode("http://div[contains(@class, 'priceSection')]//div[contains(@class, 'priceValue')]/span");