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