C# HtmlAgilityPack adding tbody

本文关键字:tbody adding HtmlAgilityPack | 更新日期: 2023-09-27 18:31:17

C# HtmlAgilityPack,在LoadHtml函数之后将tbody元素添加到表中的DOM树中,即使它在原始HTML文档中不存在。如何禁用此功能?

我的算法通过遍历 dom 树来创建一些 XPATH 表达式,原始文档中不存在的 tbody 元素使 SelectNode 找不到所需的项目。我花了很多时间来弄清楚这一点:|

是否可以让 SelectNode 也考虑 HtmlAgilityPack 添加的节点?

例:

<table>
    <tr><td>data</td></tr>
</table>

我的应用程序将生成此 XPATH 来提取"数据":表/tbody/tr/td

表达式中的tbody标记是在HtmlAgilityPack解析html代码后添加到DOM树中的,因为HtmlAgilityPack添加了它,即使它不存在。正因为如此

doc.DocumentNode.SelectNodes("//table/tbody/tr/td");

会失败。

换句话说,tr元素(HtmlElement)父TagName等于"TBODY"而不是"TABLE"。此外,我正在解析许多不同的网站,所以这是一种情况。

SelectNodes在原始HTML代码中搜索,而不是通过HtmlDocument.LoadHtml之后的DOM树进行搜索,或者它不考虑它添加的"虚拟"元素。

C# HtmlAgilityPack adding tbody

您不必使用完整的层次结构。

如果您想要的只是td,只需使用以下方法:

doc.DocumentNode.SelectNodes("//table//td");

或者忽略tbody节点并获取您关心的所有层次结构:

doc.DocumentNode.SelectNodes("//table//tr/td");