使用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
。不过,这是另一个问题,你应该最终能够找到一个更健壮的选择器。也许可以尝试这样: