如何通过特定 ID 解析 html table(来自文件)
How to parse html table (from file) by specific ID
我正在尝试从下载的 html 中获取特定的 table(通过 ID)并解析它 我尝试了几种方法,我最后的代码是
var url = @"C:\Users\name\Plocha\web.html";
var doc = new HtmlDocument();
doc.Load(url);
string data = "";
int i = 2;
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table"))
{
Console.WriteLine($"Found: {table.Id}");
if (table.Id == "formTbl")
{
foreach (HtmlNode row in table.SelectNodes("//tr"))
{
foreach (HtmlNode cell in row.SelectNodes("td"))
{
if (i == 1)
{
data += $"Column:{cell.InnerText}";
i = 2;
}
else if (i == 2)
{
data += $"Row: {cell.InnerText}";
Console.WriteLine(data);
data = "";
i = 1;
}
}
}
}
else
{
Console.WriteLine("Not what we want");
}
}
问题是即使我指定仅在 id = formTbl 时才继续,它也会从网页打印所有 tables。
数据在 table 上的外观(没有列名,只有两行,第一行是列名,第二行是值)
SelectNodes()
进行 XPath
查询。一些有用的examples here。与您的情况相关的一个特定的是://book
- 选择所有书籍元素,无论它们在文档中的什么位置.
这意味着不要使用 "//tr"
(搜索整个文档),如果您想尊重范围,您应该寻找 "tr"
。
您甚至可以使用 xpath 进行 id
搜索并选择下面的 <tr>
,使用单个查询:
foreach (var row in doc.DocumentNode.SelectNodes("//table[@id='formTbl']/tr"))
{
// ...do <tr> stuff
foreach (var cell in row.SelectNodes("td"))
{
// ... do <td> stuff
}
}
foreach (var table in doc.DocumentNode.SelectNodes("//table[@id='formTbl']"))
{
foreach (var row in table.SelectNodes("tbody/tr"))
{
Console.WriteLine(row.Id);
foreach (var cell in row.SelectNodes("td"))
{
Console.WriteLine(cell.InnerText);
}
}
}
问题是我没用过tbody/tr
感谢@NPras
我正在尝试从下载的 html 中获取特定的 table(通过 ID)并解析它 我尝试了几种方法,我最后的代码是
var url = @"C:\Users\name\Plocha\web.html";
var doc = new HtmlDocument();
doc.Load(url);
string data = "";
int i = 2;
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table"))
{
Console.WriteLine($"Found: {table.Id}");
if (table.Id == "formTbl")
{
foreach (HtmlNode row in table.SelectNodes("//tr"))
{
foreach (HtmlNode cell in row.SelectNodes("td"))
{
if (i == 1)
{
data += $"Column:{cell.InnerText}";
i = 2;
}
else if (i == 2)
{
data += $"Row: {cell.InnerText}";
Console.WriteLine(data);
data = "";
i = 1;
}
}
}
}
else
{
Console.WriteLine("Not what we want");
}
}
问题是即使我指定仅在 id = formTbl 时才继续,它也会从网页打印所有 tables。
数据在 table 上的外观(没有列名,只有两行,第一行是列名,第二行是值)
SelectNodes()
进行 XPath
查询。一些有用的examples here。与您的情况相关的一个特定的是://book
- 选择所有书籍元素,无论它们在文档中的什么位置.
这意味着不要使用 "//tr"
(搜索整个文档),如果您想尊重范围,您应该寻找 "tr"
。
您甚至可以使用 xpath 进行 id
搜索并选择下面的 <tr>
,使用单个查询:
foreach (var row in doc.DocumentNode.SelectNodes("//table[@id='formTbl']/tr"))
{
// ...do <tr> stuff
foreach (var cell in row.SelectNodes("td"))
{
// ... do <td> stuff
}
}
foreach (var table in doc.DocumentNode.SelectNodes("//table[@id='formTbl']"))
{
foreach (var row in table.SelectNodes("tbody/tr"))
{
Console.WriteLine(row.Id);
foreach (var cell in row.SelectNodes("td"))
{
Console.WriteLine(cell.InnerText);
}
}
}
问题是我没用过tbody/tr
感谢@NPras