使用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
相关产品推荐
相关产品推荐

