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 敏捷包的主要内容,如果未能解决你的问题,请参考以下文章