使用C#編寫的Html Agility Pack來下載比特幣價格
P粉156532706
2023-09-05 17:17:03
<p>我需要使用Html Agility Pack從https://coinmarketcap.com/currencies/bitcoin/取得比特幣價格。我正在使用這個例子,它運行良好:</p>
<pre class="brush:php;toolbar:false;">var html = @"http://html-agility-pack.net/";
HtmlWeb web = new HtmlWeb();
var htmlDoc = web.Load(html);
var node = htmlDoc.DocumentNode.SelectSingleNode("//head/title");
Console.WriteLine("Node Name: " node.Name "\n" node.OuterHtml);</pre>
<p>XPath為:<code>//*[@id="__next"]/div/div[1]/div[2]/div/div[1]/div[2]/div/ div[2]/div[1]/div</code></p>
<p>HTML代碼:</p>
<pre class="brush:php;toolbar:false;"><div class="priceValue "><span>$17,162.42</span></div></pre>
<p>我嘗試了下面的程式碼,但它返回"物件引用未設定為物件的實例":</p>
<pre class="brush:php;toolbar:false;">var html = @"https://coinmarketcap.com/currencies/bitcoin/";
HtmlWeb web = new HtmlWeb();
var htmlDoc = web.Load(html);
var node = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='priceValue']/span");
Console.WriteLine("Node Name: " node.Name "\n" node.InnerText);`</pre></p>
TLDR:
HtmlWeb
解壓縮回應(或使用適當的HTTP客戶端)顯然,
SelectSingleNode()
呼叫回傳null
,因為它找不到節點。在這種情況下,檢查載入的HTML是有幫助的。你可以透過取得
htmlDoc.DocumentNode.InnerHtml
的值來做到這一點。我嘗試過這樣做,生成的“HTML”是無意義的。原因是
HtmlWeb
預設不解壓縮它收到的回應。有關詳細信息,請參見此github問題。如果你使用了一個合適的HTTP客戶端(像這個),或者如果HtmlAgilityPack開發人員更加積極,我認為你不會遇到這個問題。如果你堅持使用
HtmlWeb
,你的程式碼應該如下所示:請注意,你要找的元素的類別其實是
priceValue
(最後有一個空格字元),頁面中還有另一個類別為priceValue
的div
。不過,這是另一個問題,你應該最終能夠找到一個更健壯的選擇器。也許可以嘗試這樣: