C#HtmlAgilityPack添加tbody

时间:2016-01-21 16:13:02

标签: c# html xpath html-agility-pack

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树搜索,或者它不考虑由它添加的“虚拟”元素。

1 个答案:

答案 0 :(得分:1)

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

如果您想要的只是td s:

,请使用以下内容
doc.DocumentNode.SelectNodes("//table//td");

或者只是忽略tbody节点并获得您关注的所有层次结构:

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