HTML敏捷性包 – parsing表

我想使用HTML敏捷性包parsing来自复杂网页的表,但我在某种程度上迷失在对象模型中。

我看了链接的例子,但没有find任何表格数据。 我可以使用XPath获取表格吗? 加载了关于如何获取表格的数据后,我基本上已经丢失了。 我之前在Perl中做过这件事,这有点笨拙,但工作。 ( HTML::TableParser )。

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

怎么样的东西:(使用HTML敏捷包: http : //www.codeplex.com/htmlagilitypack )

 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到对象更漂亮:

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

我发现为某个特定元素获取XPath的最简单的方法是安装Firefox的FireBug扩展转到网站/网页按F12调出萤火虫; 右键单击要查询的页面上的元素,然后select“Inspect Element”,Firebug将在IDE中select该元素,然后右键单击Firebug中的元素并select“Copy XPath”,此function将为您提供精确的XPath查询你需要使用HTML Agility Library获取你想要的元素。

从上面的线回答:

 HtmlDocument doc = new HtmlDocument(); 

这在VS 2015 C#中不起作用。 你不能再构build一个HtmlDocument

另一个MS“function”使事情变得更加困难。 试试HtmlAgilityPack.HtmlWeb ,看看这个链接的一些示例代码。

在我的情况下,有一个单一的表恰好是来自路由器的设备列表。 如果您希望使用TR / TH / TD(行,标题,数据)而不是如上所述的matrix来读取表格,则可以执行以下操作:

  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只是一个以Header和Data为属性的简单对象。 该方法照顾无效和这种情况下:

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