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

使用C#中的HtmlAgilityPack提取HTML节点数据时遭遇空引用错误,如何解决?

解决HtmlAgilityPack提取数据时的空引用错误

你的问题核心是SelectNodes返回了null,直接调用First()触发了空引用异常。我们一步步来解决这个问题:

第一步:先加空检查,避免程序崩溃

永远不要假设SelectNodes一定会返回非null结果,先做判断再处理:

var tsNumNodes = doc.DocumentNode.SelectNodes("//span[@class='ts-num']");
if (tsNumNodes != null && tsNumNodes.Count > 0)
{
    var value = tsNumNodes.First();
    Console.WriteLine(value.InnerText);
}
else
{
    Console.WriteLine("未找到带有ts-num类的span节点");
}

第二步:排查节点找不到的原因

接下来分析为什么匹配不到目标节点,对应解决方案如下:

1. 确认HTML内容加载正确

先检查你是否正确加载了HTML内容:

  • 如果是字符串加载,确保字符串没有转义错误或被截断;
  • 如果是网页抓取,确认响应内容完整无缺失。

示例正确加载代码:

var htmlContent = @"<div _ngcontent-bxt-c141="" xlcell=""6"" data-header=""Bonus"" class=""ts-table-row-item xlformatNumber""> 
    <span _ngcontent-bxt-c141="" class=""ts-num"">9,000.00</span> 
</div>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlContent);

2. 使用更精准的XPath选择器

你的目标span在带有data-header="Bonus"的div下,可以用更精准的路径定位,降低匹配失败概率:

var targetNode = doc.DocumentNode.SelectSingleNode("//div[@data-header='Bonus']//span[@class='ts-num']");
if (targetNode != null)
{
    Console.WriteLine(targetNode.InnerText);
}

3. 处理多类名的匹配场景

如果span的class属性包含多个类名(比如ts-num other-class),原有的精确匹配@class='ts-num'会失效,改用contains匹配包含指定类名的节点:

var nodes = doc.DocumentNode.SelectNodes("//span[contains(@class, 'ts-num')]");

4. 改用Linq API替代XPath

HtmlAgilityPack支持Linq查询,这种方式更直观,也能避开XPath的一些坑:

var spanNode = doc.DocumentNode.Descendants("span")
                  .FirstOrDefault(span => span.GetAttributeValue("class", "") == "ts-num");
if (spanNode != null)
{
    Console.WriteLine(spanNode.InnerText);
}

额外提示

如果是从Angular这类动态渲染的网页抓取数据,注意HtmlAgilityPack只能解析静态HTML。如果数据是JS动态加载的,你需要用Selenium或Playwright这类工具先渲染页面,再获取完整HTML后再解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:52:27