TLDR:
HtmlWeb
解壓縮回應(yīng)(或使用適當(dāng)?shù)腍TTP客戶端)顯然,SelectSingleNode()
呼叫回傳null
,因為它找不到節(jié)點。
在這種情況下,檢查載入的HTML是有幫助的。你可以透過取得htmlDoc.DocumentNode.InnerHtml
的值來做到這一點。我嘗試過這樣做,生成的“HTML”是無意義的。
原因是HtmlWeb
預(yù)設(shè)不解壓縮它收到的回應(yīng)。有關(guān)詳細(xì)信息,請參見此github問題。如果你使用了一個合適的HTTP客戶端(像這個),或者如果HtmlAgilityPack開發(fā)人員更加積極,我認(rè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");
請注意,你要找的元素的類別其實是priceValue
(最後有一個空格字元),頁面中還有另一個類別為priceValue
的 div
。不過,這是另一個問題,你應(yīng)該最終能夠找到一個更健壯的選擇器。也許可以嘗試這樣:
HtmlNode node = doc.DocumentNode.SelectSingleNode("http://div[contains(@class, 'priceSection')]//div[contains(@class, 'priceValue')]/span");