如何按特定 ID 解析 html 表(来自文件)
Posted
技术标签:
【中文标题】如何按特定 ID 解析 html 表(来自文件)【英文标题】:How to parse html table (from file) by specific ID 【发布时间】:2021-12-07 01:57:45 【问题描述】:我正在尝试从下载的 html 中获取特定表(通过 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 时继续。
数据在表上的外观(没有列名,只有两行,第一行是列名,第二行是值)
【问题讨论】:
【参考方案1】: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
【讨论】:
您好,我收到异常 System.NullReferenceException: '对象引用未设置为对象的实例。不太确定它有什么问题。 pastebin.com/USa7xDHS @Justyn 区分大小写。你的桌子 id 是formtbl
还是 formTbl
?
是的,我认为是 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
【讨论】:
以上是关于如何按特定 ID 解析 html 表(来自文件)的主要内容,如果未能解决你的问题,请参考以下文章
xcode 解析来自 webview 的 html id 数据