HtmlAgilityPack仅部分解析目标表格行问题求助(C# WPF)
解决HtmlAgilityPack解析老旧站点table时提前闭合的问题
我之前在处理教育类老旧站点的HTML解析时,也碰到过HtmlAgilityPack类似的「提前闭合标签」问题——这类站点的HTML往往不严格遵循规范,导致解析器误判节点结束位置。针对你遇到的最后一个<table>只解析前2行的情况,给你几个可行的解决方案:
方案1:调整HtmlAgilityPack的解析宽松度
HtmlAgilityPack默认的解析规则对不规范HTML的容忍度有限,开启几个关键选项可以让它更「宽容」:
// 加载页面后立即设置解析选项 var htmlProgDoc = web.Load("https://aips.um.si/PredmetiBP5/Main.asp?Mode=prg&Zavod=77&Jezik=&Nac=1&Nivo=P&Prg=1571&Let=1"); htmlProgDoc.OptionFixNestedTags = true; // 自动修复嵌套错误的标签 htmlProgDoc.OptionAutoCloseOnEnd = false; // 禁止解析器在文档末尾自动闭合未结束的标签 htmlProgDoc.OptionCheckSyntax = false; // 关闭语法检查,避免因不规范HTML终止解析 // 再尝试定位目标table,两种方式任选其一 var targetTable = htmlProgDoc.DocumentNode.SelectSingleNode("/html/body/div/center[2]/font/font/font/table"); // 或者直接取页面最后一个table // var targetTable = htmlProgDoc.DocumentNode.SelectNodes("//table")?.Last();
方案2:单独提取目标table的HTML片段重新解析
有时候整个页面的解析上下文会干扰目标节点的解析,单独提取table的HTML再解析往往能解决问题:
// 先获取所有table节点 var allTables = htmlProgDoc.DocumentNode.SelectNodes("//table"); if (allTables != null && allTables.Count == 6) // 你提到页面共6个table,取最后一个 { var targetTableNode = allTables[5]; // 索引从0开始,第6个对应索引5 // 提取table的内部HTML var tableInnerHtml = targetTableNode.InnerHtml; // 创建新的HtmlDocument专门解析这个table片段 var tableDoc = new HtmlDocument(); tableDoc.OptionFixNestedTags = true; tableDoc.LoadHtml($"<table>{tableInnerHtml}</table>"); // 补全完整的table标签结构 // 现在可以获取完整的tr行 var allRows = tableDoc.DocumentNode.SelectNodes("//tr"); if (allRows != null) { foreach(var row in allRows) { // 处理每行数据逻辑 } } }
方案3:预处理原始HTML修复不规范标签
老旧站点常出现未闭合的<br>、未转义的特殊字符等问题,提前修复这些能减少解析错误:
// 先获取原始HTML字符串(确保编码正确) var rawHtml = web.Load(url, iso).DocumentNode.OuterHtml; // 替换未闭合的标签,比如<br>换成规范的<br/> rawHtml = rawHtml.Replace("<br>", "<br/>").Replace("<hr>", "<hr/>"); // 也可以处理其他常见的不规范标签,比如未闭合的<td>(不过自动修复选项也能覆盖大部分情况) // 重新加载修复后的HTML var htmlProgDoc = new HtmlDocument(); htmlProgDoc.OptionFixNestedTags = true; htmlProgDoc.LoadHtml(rawHtml); // 再定位目标table var targetTable = htmlProgDoc.DocumentNode.SelectNodes("//table")?.Last();
额外注意点
- 确保你使用的是最新版本的HtmlAgilityPack,旧版本对不规范HTML的支持较差,直接在NuGet更新到最新稳定版即可。
- 编码设置要确认:你已经设置了
OverrideEncoding = iso,可以尝试直接用web.Load(url, iso)加载,避免编码自动检测的干扰。
内容的提问来源于stack exchange,提问作者Kevin Šuc
相关产品推荐
相关产品推荐

