HTML敏捷包

时间:2010-03-11 05:32:05

标签: c# .net winforms html-parsing html-agility-pack

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

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

如果有人知道,那么请尽可能给我示例

编辑:

是否可以解析html表,就像我们只想提取已确定的列名数据一样?就像有4列名称,地址,phno,我想只提取名称和地址数据。

1 个答案:

答案 0 :(得分:6)

在论坛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
}

EDIT2: 如果您不知道列的索引,您可以完成这样的整个过程。我没有测试过这个。

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