unity3d 使用Html敏捷包下载比特币价格(C#)

mctunoxg  于 2022-12-19  发布在  C#
关注(0)|答案(1)|浏览(148)

我需要使用Html Agility Pack从https://coinmarketcap.com/currencies/bitcoin/获取比特币价格。我使用这个例子,效果很好:

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

XPath为:第一个月
HTML:

<div class="priceValue "><span>$17,162.42</span></div>

我尝试过下面的代码,但它返回“对象引用未设置为对象的示例”:

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);`
8xiog9wr

8xiog9wr1#

TLDR:
1.您需要告诉HtmlWeb解压缩响应(或者使用适当的HTTP客户端)
1.您需要修复XPath选择器
显然,SelectSingleNode()调用返回null,因为它找不到节点。
在这种情况下,检查加载的HTML是很有帮助的。你可以通过获取htmlDoc.DocumentNode.InnerHtml的值来完成这一点。我试过了,产生的“HTML”是乱码。
原因是HtmlWeb在默认情况下不会解压缩它收到的响应。请参阅this github issue了解详细信息。我认为如果您使用正确的HTTP客户端(如this one),或者如果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(后面有一个空格),页面中还有一个div,类是priceValue,这是另一个问题,你最终应该能找到一个更健壮的选择器,可能是这样的:

HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[contains(@class, 'priceSection')]//div[contains(@class, 'priceValue')]/span");

相关问题