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

