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树进行搜索,或者它不考虑它添加的"虚拟"元素。
您不必使用完整的层次结构。
如果您想要的只是td
,只需使用以下方法:
doc.DocumentNode.SelectNodes("//table//td");
或者忽略tbody
节点并获取您关心的所有层次结构:
doc.DocumentNode.SelectNodes("//table//tr/td");