如何按特定 ID 解析 html 表(来自文件)

Posted

技术标签:

【中文标题】如何按特定 ID 解析 html 表(来自文件)【英文标题】:How to parse html table (from file) by specific ID 【发布时间】:2021-12-07 01:57:45 【问题描述】:

我正在尝试从下载的 html 中获取特定表(通过 id)并解析它我尝试了几种方法,我的最后一个代码是

            var url = @"C:\Users\name\Plocha\web.html";

        var doc = new HtmlDocument();

        doc.Load(url);

        string data = "";
        int i = 2;
        foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table"))
        
            Console.WriteLine($"Found: table.Id");
            if (table.Id == "formTbl")
            
                foreach (HtmlNode row in table.SelectNodes("//tr"))
                
                    foreach (HtmlNode cell in row.SelectNodes("td"))
                    
                        if (i == 1)
                        
                            data += $"Column:cell.InnerText";
                            i = 2;
                        
                        else if (i == 2)
                        
                            data += $"Row: cell.InnerText";
                            Console.WriteLine(data);
                            data = "";
                            i = 1;
                        
                        
                        
                            
                    
                    
                    
                
            
            else
            
                Console.WriteLine("Not what we want");
            



        

问题是它会打印网页中的所有表格,即使我已指定仅在 id = formTbl 时继续。

数据在表上的外观(没有列名,只有两行,第一行是列名,第二行是值)

【问题讨论】:

【参考方案1】:

SelectNodes() 接受XPath 查询。一些有用的examples here。与您的案例相关的一个特定内容是://book - 选择所有书籍元素无论它们在文档中的什么位置

这意味着如果你想尊重范围,你应该寻找"tr",而不是使用"//tr"(搜索整个文档)。

您甚至可以使用 xpath 执行 id 搜索并选择下面的 <tr>,使用单个查询:

foreach (var row in doc.DocumentNode.SelectNodes("//table[@id='formTbl']/tr"))

    // ...do <tr> stuff
    foreach (var cell in row.SelectNodes("td"))
    
        // ... do <td> stuff
    

【讨论】:

您好,我收到异常 System.NullReferenceException: '对象引用未设置为对象的实例。不太确定它有什么问题。 pastebin.com/USa7xDHS @Justyn 区分大小写。你的桌子 id 是 formtbl 还是 formTbl 是的,我认为是 @Justyn 你在 pastebin 上链接的代码是小写的好吧,这是我的代码,我尝试了新的但没有真正工作:pastebin.com/T5TGganw
【参考方案2】:
foreach (var table in doc.DocumentNode.SelectNodes("//table[@id='formTbl']"))

    foreach (var row in table.SelectNodes("tbody/tr"))
    
        Console.WriteLine(row.Id);
        foreach (var cell in row.SelectNodes("td"))
        
            Console.WriteLine(cell.InnerText);
        
    

问题是我没有用过 tbody/tr

感谢@NPras

【讨论】:

以上是关于如何按特定 ID 解析 html 表(来自文件)的主要内容,如果未能解决你的问题,请参考以下文章

按特定 ID 删除一行,该行不存在另一个表的列 ID

查看sqlserver被锁的表以及如何解锁

xcode 解析来自 webview 的 html id 数据

查看sqlserver被锁的表以及如何解锁.

如何使用来自 json 文件的 vue-router 的用户 ID 检查特定的用户详细信息组件?

如何按特定用户打开文件