You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Html Agility Pack获取比特币价格(C#)

解决Html Agility Pack获取比特币价格的空引用错误

错误原因分析

出现Object reference not set to an instance of an object的核心原因有两个:

  • Class匹配不精准:目标元素的class是priceValue (末尾带空格),你写的//div[@class='priceValue']无法匹配到该元素。
  • 反爬拦截:CoinMarketCap会检测请求的User-Agent,默认HtmlWeb的请求头会被识别为爬虫,导致加载的HTML内容并非实际页面,自然找不到目标节点。

修正后的代码

var url = @"https://coinmarketcap.com/currencies/bitcoin/";
HtmlWeb web = new HtmlWeb();

// 模拟浏览器请求头,避免被反爬拦截
web.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36";

var htmlDoc = web.Load(url);

// 使用normalize-space处理class的空格问题,确保精准匹配
var node = htmlDoc.DocumentNode.SelectSingleNode("//div[normalize-space(@class)='priceValue']/span");

// 先判断节点是否存在,再输出内容
if (node != null)
{
    Console.WriteLine($"比特币当前价格: {node.InnerText}");
}
else
{
    Console.WriteLine("未找到价格节点,请检查页面结构或请求头");
}

关键改动说明

  • 添加User-Agent:模拟浏览器发送请求,绕过基础反爬机制,确保加载到完整的页面内容。
  • 修正XPath匹配:用normalize-space(@class)去除class属性值的首尾空格,解决因末尾空格导致的匹配失败问题;也可以改用contains(@class, 'priceValue'),但前者匹配更精准。
  • 空引用检查:在访问node的属性前先判断是否为null,避免触发空引用异常。

备选方案(使用原始XPath)

如果页面结构变动,也可以用你提供的原始XPath,同样需要处理请求头和空检查:

var node = htmlDoc.DocumentNode.SelectSingleNode("//*[@id='__next']/div/div[1]/div[2]/div/div[1]/div[2]/div/div[2]/div[1]/div/span");

内容的提问来源于stack exchange,提问作者ForTheHorde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:45:24