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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:34:44