HTML 敏捷包

Posted

技术标签:

【中文标题】HTML 敏捷包【英文标题】:HTML Agility Pack 【发布时间】:2011-01-26 05:41:34 【问题描述】:

我想使用 html 敏捷包解析 html 表。我只想从表中提取一些预定义的列数据。

但我是解析和 html 敏捷包的新手,我已经尝试过,但我不知道如何使用 html 敏捷包来满足我的需要。

如果有人知道,请尽可能举个例子

编辑:

如果我们只想提取决定的列名的数据,是否可以解析 html 表?就像有 4 列名称、地址、电话号码,我只想提取名称和地址数据。

【问题讨论】:

@Harikrishna - 你有表结构的小样本吗? 有关使用 html Agility pack 从 html 数据中提取数据的更多信息:***.com/questions/2431652/html-agility-pack 【参考方案1】:

在论坛here 中有一个例子。向下滚动一点以查看表格答案。我真希望他们能提供更容易找到的更好的样本。

编辑: 要从特定列中提取数据,您必须首先找到与您想要的列相对应的 <th> 标记并记住它们的索引。然后,您需要为相同的索引找到 <td> 标记。假设您知道列的索引,您可以执行以下操作:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("http://somewhere.com");
HtmlNode table = doc.DocumentNode.SelectSingleNode("//table");
foreach (var row in table.SelectNodes("//tr"))

    HtmlNode addressNode = row.SelectSingleNode("td[2]");
    //do something with address here
    HtmlNode phoneNode = row.SelectSingleNode("td[5]");
    // do something with phone here

编辑2: 如果您不知道列的索引,您可以这样做。我没有测试过。

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("http://somewhere.com");
var tables = doc.DocumentNode.SelectNodes("//table");

foreach(var table in tables)

    int addressIndex = -1;
    int phoneIndex = -1;
    var headers = table.SelectNodes("//th");
    for (int headerIndex = 0; headerIndex < headers.Count(); headerIndex++)
    
        if (headers[headerIndex].InnerText == "address")
        
            addressIndex = headerIndex;
        
        else if (headers[headerIndex].InnerText == "phone")
        
            phoneIndex = headerIndex;
        
    

    if (addressIndex != -1 && phoneIndex != -1)
    
        foreach (var row in table.SelectNodes("//tr"))
        
            HtmlNode addressNode = row.SelectSingleNode("td[addressIndex]");
            //do something with address here
            HtmlNode phoneNode = row.SelectSingleNode("td[phoneIndex]");
            // do something with phone here
        
    

【讨论】:

@Harikrishna - 每个表中的数据是否相同?您想从所有表中提取相同的列吗?您只想找到一个特定的表吗?在这里帮我一点忙。我一直在尝试回答,然后您提供更多信息。让我们在那里获取所有信息。 @Mike Two Sir..好吧,对不起...就像在网页中一样,有多个表格标签,但我只想从一个具有列名的表格中提取数据定义为地址和电话号码。其他表标签用于其他信息,无用。 @Mike Two Sir.. 有很多网页有多个表格。而且我想从每个网页中只提取一个表格的数据,该表格的名称为电话号码和地址. @Harikrishna - 不用担心,只是想让这个过程更有效率。你怎么知道要找哪张桌子?仅仅是因为表格有你想要的列吗?你知道列的位置(比如地址是第 3 位,电话是第 7 位)以及名称吗?还是你只知道名字? @Mike Two Sir.. 是的,我知道,列名是预定义的,应该从每个网页的表中提取数据。我知道列名,但不知道这些列名的位置.

以上是关于HTML 敏捷包的主要内容,如果未能解决你的问题,请参考以下文章

HTML 敏捷包

HTML 敏捷包选择节点

HTML 敏捷包,无法选择节点

Html 敏捷包 - 新的 HtmlAttribute

C# Html 敏捷包 ( SelectSingleNode )

HTML 敏捷包:解析 href 标签