HTML Agility Pack

6
我想使用Html Agility Pack解析HTML表格。我只想从表格中提取一些预定义列的数据。
但我对解析和Html Agility Pack很陌生,我尝试过,但不知道如何满足我的需求。
如果有人知道,请给我一个例子。
编辑:
是否可以像这样解析HTML表格,仅提取决定的列名数据?例如,有4列名称、地址、电话号码,我只想提取名称和地址数据。

@Harikrishna - 你有表结构的小样例吗? - Mike Two
有关使用Html Agility Pack从HTML数据中提取数据的更多信息,请参见:https://dev59.com/dkzSa4cB1Zd3GeqPnYZp - Harikrishna
1个回答

6
在讨论论坛这里有一个例子。向下滚动一点以查看表格答案。我希望他们能提供更好的示例,更易于查找。
编辑: 要从特定列中提取数据,您需要先找到与所需列相对应的<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
@Mike 两位先生,抱歉...在网页中可能有多个表格标签,但我只想从一个表格中提取数据,该表格的列名与我们定义的相同,例如地址和电话号码。其他表格标签用于其他信息,没有用处。 - Harikrishna
@Mike 两位先生,有许多网页包含多个表格。我想从每个网页中提取仅包含电话号码和地址列名的一个表格的数据。 - Harikrishna
@Harikrishna - 不用担心,只是想让这个过程更有效率。你如何知道要查找哪张表?仅仅因为该表具有所需的列吗?你知道列的位置(比如地址是第三列,电话是第七列)以及列名吗?还是只知道列名? - Mike Two
@Mike 两位先生,是的,我知道每个网页都应该从表中提取哪些数据,并且列名是预定义的。我知道这些列名,但不知道它们的位置。 - Harikrishna
@Mike 这是一个错误吗,还是它像这样工作 doc.LoadHtml("http://somewhere.com");。它会从网站加载HTML内容吗?我在文档中没有看到这一点,如果不是,请更正您的代码,以免混淆他人。 - Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接