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