首页 > 解决方案 > 如何按特定 ID 解析 html 表(来自文件)

问题描述

我正在尝试从下载的 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 时才继续。

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

标签: c#htmldatabasehtml-agility-pack

解决方案


SelectNodes()接受XPath查询。这里有一些有用的例子。与您的案例相关的一个特定问题是://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
    }
}

推荐阅读