HTML Agility包 - 解析表

wei*_*mat 53 html c# html-parsing html-agility-pack

我想使用HTML敏捷包来解析复杂网页中的表,但我在对象模型中丢失了.

我查看了链接示例,但没有找到任何表数据.我可以使用XPath来获取表吗?在加载了关于如何获取表格的数据后,我基本上已经丢失了.我之前在Perl中做过这个,它有点笨拙,但很有效.(HTML::TableParser).

如果能够解释正确的解析对象顺序,我也很高兴.

Mar*_*ell 115

如下所示:使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您需要,可以使用LINQ-to-Objects使其更漂亮:

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);
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*oda 31

我发现获得特定Element的XPath最简单的就是为Firefox安装FireBug扩展程序进入网站/网页按F12以显示firebug; 右键选择并右键单击要查询的页面上的元素,然后选择"Inspect Element"Firebug将在其IDE中选择元素,然后右键单击Firebug中的Element并选择"Copy XPath",此函数将为您提供精确的XPath查询您需要使用HTML Agility Library获取所需的元素.

  • 请记住,有时浏览器会略微更改html的DOM - 比如将<t>添加到<table>(如果它缺失).默认情况下,Html Agility Pack在解析html时也不会包含<form>和<option>标记.记住这些差异,您将在浏览器和Html Agility Pack之间的XPath兼容性方面取得更大成功. (4认同)