C#使用Html Agility Pack获取div属性报错及节点筛选问题
问题解决方法
出现空引用错误核心原因是你没有对节点、属性做非空校验,同时要注意XPath的节点索引从1开始计数,不是常用的0开头。具体实现步骤如下:
- 首先确认你请求到的原始HTML字符串中确实存在3个及以上
class="flex-item text-primary"的div节点,不要直接套用浏览器开发者工具里渲染后的结构(动态渲染的内容可能不会在原始请求中返回) - 取第三个节点的XPath写法注意索引为
[3],如果需要模糊匹配class包含对应类的节点,可以调整XPath避免漏匹配 - 所有取值操作前必须做非空判断,避免空引用报错
示例代码
using HtmlAgilityPack; // 此处替换为你实际爬取到的页面HTML字符串 string htmlContent = "你的页面HTML内容"; HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(htmlContent); // 方式1:class完全匹配时直接取第三个节点 HtmlNode targetNode = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='flex-item text-primary'][3]"); // 方式2:如果节点class还有其他额外类,用模糊匹配的XPath // HtmlNode targetNode = htmlDoc.DocumentNode.SelectSingleNode("//div[contains(@class,'flex-item') and contains(@class,'text-primary')][3]"); if (targetNode != null) { if (targetNode.Attributes.Contains("data-original-title")) { string attrValue = targetNode.Attributes["data-original-title"].Value; Console.WriteLine($"属性值为:{attrValue}"); } else { Console.WriteLine("目标节点不存在data-original-title属性"); } } else { // 排查时可以先输出所有匹配到的节点总数 var allMatchNodes = htmlDoc.DocumentNode.SelectNodes("//div[@class='flex-item text-primary']"); Console.WriteLine($"匹配到的同class节点总数:{allMatchNodes?.Count ?? 0}"); }
内容的提问来源于stack exchange,提问作者user9887190
相关产品推荐
相关产品推荐

