使用C#編寫的Html Agility Pack來下載比特幣價格
P粉156532706
P粉156532706 2023-09-05 17:17:03
0
1
714
<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>
P粉156532706
P粉156532706

全部回覆(1)
P粉729518806

TLDR:

  1. 你需要告訴 HtmlWeb 解壓縮回應(或使用適當的HTTP客戶端)
  2. 你需要修復XPath選擇器

顯然,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");
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板