HTML敏捷包 - 解析表
-
19-08-2019 - |
题
我想使用HTML敏捷包解析从复杂的网页表格,但我的对象模型我莫名其妙地丢失了。
我看了一下链接的例子,但没有发现任何表中的数据这种方式。
我可以使用XPath来获取表?我已经加载的数据,以如何获得表后我基本丧失。我曾在Perl这样做过,这是一个有点笨拙,但工作。 (HTML::TableParser
)。
我还高兴,如果可以只棚正确的对象为了使解析上的光。
解决方案
如何是这样的: 使用 HTML敏捷性包
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键,弹出萤火虫;正确的选择并右键单击您想要查询并选择“检查元素”页面上的元素萤火虫将选择在IDE中的元素,然后右键单击在Firebug的元素,然后选择“复制XPath”这个功能会给你确切的XPath查询您需要获得元素你想使用HTML敏捷库。
我知道这是一个很老的问题,但是这是我的解决方案,以可视化的表,所以你可以创建一个类结构帮助。这也使用HTML敏捷性包
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>");
var table = doc.DocumentNode.SelectSingleNode("//table");
var tableRows = table.SelectNodes("tr");
var columns = tableRows[0].SelectNodes("th/text()");
for (int i = 1; i < tableRows.Count; i++)
{
for (int e = 0; e < columns.Count; e++)
{
var value = tableRows[i].SelectSingleNode($"td[{e + 1}]");
Console.Write(columns[e].InnerText + ":" + value.InnerText);
}
Console.WriteLine();
}
在我的情况下,存在一个单一的表这恰好是从一个路由器的装置列表。如果希望使用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%"> </td>
</tr>
这是一个没有标题行。与常量挂了它的HtmlBody对象很可能推导出容易,但我为它甚至还在道歉。我来自于世界里,如果你在你的代码有“,它要么是恒定的,本地化的。
从上面的回答行:
HtmlDocument doc = new HtmlDocument();
这不会在VS 2015 C#工作。不能构建一个HtmlDocument
任何更多。
另一个MS的“功能”,使事情更加难以使用。尝试HtmlAgilityPack.HtmlWeb
,并检查了此链接对于一些示例代码。