C#HtmlAgilityPack,将LoadHtml函数之后的tbody元素添加到表中的DOM树中,即使它在原始HTML文档中不存在。如何禁用此功能?
我的算法通过遍历dom树创建一些XPATH表达式,原始文档中的非现有tbody元素使SelectNodes找不到所需的项目。花了我很多时间来弄明白:|
是否可以使SelectNodes还考虑由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树搜索,或者它不考虑由它添加的“虚拟”元素。
答案 0 :(得分:1)
您不必使用完整的层次结构。
如果您想要的只是td
s:
doc.DocumentNode.SelectNodes("//table//td");
或者只是忽略tbody
节点并获得您关注的所有层次结构:
doc.DocumentNode.SelectNodes("//table//tr/td");