Har*_*hna 6 .net c# html-parsing winforms html-agility-pack
我想使用html敏捷包解析html表.我想从表中只提取一些预定义的列数据.
但我是解析和html敏捷包的新手,我已经尝试但我不知道如何使用html敏捷包来满足我的需求.
如果有人知道的话,请尽可能给我示例
编辑:
如果我们只想提取决定的列名数据,是否可以解析html表?就像有4列名称,地址,phno和我想要只提取名称和地址数据.
在这里的讨论论坛中有一个例子.向下滚动一下以查看表格答案.我希望他们能提供更容易找到的更好的样品.
编辑:要从特定列中提取数据,您必须首先找到<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
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
}
Run Code Online (Sandbox Code Playgroud)