我想使用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%">&nbsp;</td>
</tr>

这是一个没有标题行。与常量挂了它的HtmlBody对象很可能推导出容易,但我为它甚至还在道歉。我来自于世界里,如果你在你的代码有“,它要么是恒定的,本地化的。

从上面的回答行:

HtmlDocument doc = new HtmlDocument();

这不会在VS 2015 C#工作。不能构建一个HtmlDocument任何更多。

另一个MS的“功能”,使事情更加难以使用。尝试HtmlAgilityPack.HtmlWeb,并检查了此链接对于一些示例代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top