【发布时间】:2016-04-27 23:50:43
【问题描述】:
C# HtmlAgilityPack,在 LoadHtml 函数之后将 tbody 元素添加到表格中的 DOM 树中,即使它在原始 HTML 文档中不存在。如何禁用此功能?
我的算法创建了一些 XPATH 表达式,通过遍历 dom 树和原始文档中不存在的 tbody 元素使 SelectNodes 找不到所需的项目。我花了很多时间才弄清楚这个:|
是否可以让 SelectNodes 也考虑 HtmlAgilityPack 添加的节点?
例子:
<table>
<tr><td>data</td></tr>
</table>
我的应用程序会生成这个 XPATH 来提取“数据”: //table/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 树中搜索,或者它不考虑由它添加的“虚拟”元素。
【问题讨论】:
-
我认为您只需将
tr/d更改为tr/td。
标签: c# html xpath html-agility-pack