首頁  >  問答  >  主體

使用C#編寫的Html Agility Pack來下載比特幣價格

<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粉156532706P粉156532706430 天前664

全部回覆(1)我來回復

  • P粉729518806

    P粉7295188062023-09-06 09:17:49

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

    回覆
    0
  • 取消回覆