HtmlAgilityPack通过InnerText选节点失效:含空白字符场景
解决HtmlAgilityPack匹配含空白字符InnerText失效的问题
这个问题我之前也碰到过——当目标节点的文本里有多余的空格、换行或者制表符时,单纯用Trim()根本不管用,因为它只处理首尾的空白,内部的连续空白还是会让匹配逻辑失效。
问题根源
你的代码里用了Contains,但如果节点的InnerText里是" ASUS HYPER M.2 X16 CARD "(首尾空格),甚至是"ASUS HYPER\nM.2 X16 CARD"(中间多个空格+换行),而你复制的target_title是"ASUS HYPER M.2 X16 CARD"(标准空格),哪怕两边都Trim(),节点文本里的内部空白还是和目标文本不一致,自然匹配不上。
解决方案:统一清理空白字符
我们可以写一个辅助方法,把所有连续的空白字符(空格、换行、制表符等)替换成单个空格,再去掉首尾空格,这样就能让两边的文本格式统一:
private static string CleanWhitespace(string text) { // 用正则把所有连续空白替换成单个空格,再Trim首尾 return System.Text.RegularExpressions.Regex.Replace(text, @"\s+", " ").Trim(); }
然后修改你的查询逻辑,对节点文本和目标文本都做清理:
// 先清理目标文本 var cleanedTarget = CleanWhitespace(target_title); // 遍历节点时也清理文本再匹配 var targetElementNodes = document.DocumentNode.Descendants() .Where(d => CleanWhitespace(d.InnerText).Contains(cleanedTarget)) .ToList();
如果你的需求是精确匹配(而不是包含),可以把Contains换成Equals:
var targetElementNodes = document.DocumentNode.Descendants() .Where(d => CleanWhitespace(d.InnerText) == CleanWhitespace(target_title)) .ToList();
测试你的示例节点
对于你给出的<a>标签,它的InnerText是" ASUS HYPER M.2 X16 CARD ",经过CleanWhitespace处理后会变成"ASUS HYPER M.2 X16 CARD",和你复制的目标文本格式完全一致,就能成功匹配了。
内容的提问来源于stack exchange,提问作者evans
相关产品推荐
相关产品推荐

