代码之家  ›  专栏  ›  技术社区  ›  weismat

HTML敏捷性包-分析表

  •  51
  • weismat  · 技术社区  · 17 年前

    我想使用HTML敏捷性包来解析复杂网页中的表,但不知何故,我在对象模型中迷失了方向。

    我查看了链接示例,但没有找到任何这样的表数据。 我可以使用xpath获取表吗?在加载了关于如何获取表的数据之后,我基本上是迷路了。我以前用过Perl,它有点笨拙,但很有效。( HTML::TableParser )

    我也很高兴能为解析提供正确的对象顺序。

    4 回复  |  直到 8 年前
        1
  •  111
  •   peinearydevelopment    8 年前

    比如: 使用 HTML Agility Pack

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>");
    foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) {
        Console.WriteLine("Found: " + table.Id);
        foreach (HtmlNode row in table.SelectNodes("tr")) {
            Console.WriteLine("row");
            foreach (HtmlNode cell in row.SelectNodes("th|td")) {
                Console.WriteLine("cell: " + cell.InnerText);
            }
        }
    }
    

    请注意,如果需要,可以使用linq to对象使其更漂亮:

    var query = from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>()
                from row in table.SelectNodes("tr").Cast<HtmlNode>()
                from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
                select new {Table = table.Id, CellText = cell.InnerText};
    
    foreach(var cell in query) {
        Console.WriteLine("{0}: {1}", cell.Table, cell.CellText);
    }
    
        2
  •  31
  •   Coda    16 年前

    最简单的是,我找到了一个特定元素的xpath,安装firefox的firebug扩展,到站点/网页,按F12打开firebug;右键选择并右键单击要查询的页面上的元素,选择“inspect element”firebug将在其ide中选择元素,然后右键单击该元素。在Firebug中,选择“copy xpath”,这个函数将为您提供使用HTML敏捷性库获取所需元素所需的准确xpath查询。

        3
  •  0
  •   Shibumi Tait    9 年前

    在我的例子中,有一个表恰好是来自路由器的设备列表。如果您希望使用tr/th/td(行、头、数据)而不是如上所述的矩阵来读取表,可以执行如下操作:

        List<TableRow> deviceTable = (from table in document.DocumentNode.SelectNodes(XPathQueries.SELECT_TABLE)
                                           from row in table?.SelectNodes(HtmlBody.TR)
                                           let rows = row.SelectSingleNode(HtmlBody.TR)
                                           where row.FirstChild.OriginalName != null && row.FirstChild.OriginalName.Equals(HtmlBody.T_HEADER)
                                           select new TableRow
                                           {
                                               Header = row.SelectSingleNode(HtmlBody.T_HEADER)?.InnerText,
                                               Data = row.SelectSingleNode(HtmlBody.T_DATA)?.InnerText}).ToList();
                                           }  
    

    TableRow只是一个简单的对象,其标题和数据作为属性。 该方法处理空性,这种情况下:

    <tr>
        <td width="28%">&nbsp;</td>
    </tr>

    这是没有标题的行。带有挂起常量的htmlbody对象可能很容易被推导出来,但我还是为此道歉。我来自一个世界,如果你的代码中有“它应该是常量或者是可本地化的。

        4
  •  -1
  •   Nathaniel Ford iFail    10 年前

    以上答案的行:

    HtmlDocument doc = new HtmlDocument();
    

    与2015年相比,这是行不通的。不能构造 HtmlDocument 再。

    另一个MS“功能”,使事情更难使用。尝试 HtmlAgilityPack.HtmlWeb 退房 this link 对于一些示例代码。