如何通过特定 ID 解析 html table(来自文件)

How to parse html table (from file) by specific ID

我正在尝试从下载的 html 中获取特定的 table(通过 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 时才继续,它也会从网页打印所有 tables。

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

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
    }
}
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