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

HtmlAgilityPack循环查div下h2重复输出相同值如何解决?

HtmlAgilityPack遍历节点提取子元素始终返回首个匹配项问题解决

问题复现

待解析HTML代码

<div class="MyDiv">
<h2>Josh</h2>
</div>

<div class="MyDiv">
<h2>Anna</h2>
</div>

<div class="MyDiv">
<h2>Peter</h2>
</div>

原有C#实现代码

string url = "https://...";
var web = new HtmlWeb();
HtmlNode[] nodes = null;
HtmlDocument doc = null;
doc = web.Load(url);
// 注意:原代码此处XPath存在语法遗漏,缺少闭合的']',需补全为//div[@class='MyDiv']
nodes = doc.DocumentNode.SelectNodes("//div[@class='MyDiv']").ToArray() ?? null;
foreach (HtmlNode n in nodes){
     var name = n.SelectSingleNode("//h2");
     Console.WriteLine(name.InnerHtml);        
}

异常输出

Josh
Josh
Josh

问题根因

XPath语法规则中,以//开头的查询默认从整个HTML文档的根节点发起全局检索,和调用SelectSingleNode方法的当前节点上下文无关,因此每次查询都会返回整个文档中第一个<h2>标签的内容。

修复方案

将子节点查询语句中的//h2替换为.//h2即可。

语法说明:XPath中.代表当前上下文节点,.//h2的含义为仅在当前遍历到的div.MyDiv节点的后代节点中检索<h2>标签,每次都会返回当前div内部对应的h2内容。

修复后代码片段

foreach (HtmlNode n in nodes){
     // 加.限定检索范围为当前节点内部
     var name = n.SelectSingleNode(".//h2");
     Console.WriteLine(name.InnerHtml);        
}

正常输出

Josh
Anna
Peter

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:36:02