【问题标题】:Exception while querying HTML for ID using HTML Agility Pack使用 HTML Agility Pack 查询 HTML 以获取 ID 时出现异常
【发布时间】:2010-07-04 12:40:52
【问题描述】:

我正在使用 HTML Agility 包在 Visual Studio 中解析一个 ASPX 文件。

我正在搜索具有指定 ID 属性的元素。

我使用的代码是:

var html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml(docText);
if (html.DocumentNode != null)
{
     try
     {
          var tagsWithId = html.DocumentNode.SelectNodes(string.Format("//[@id='{0}']", selector.Id));

但是,当我运行此代码时,它会引发异常“表达式必须计算为节点集”。

谁能告诉我为什么这个“必须”评估为节点集?为什么它不能简单地不返回任何节点(下一行调用 tagsWithId.Count)? SelectNodes方法返回的HtmlNodeCollection肯定可以包含0个节点吧?

或者是由于格式错误的 Xpath 表达式导致的错误? [我正在测试的选择器 ID 肯定存在于文件中,为

。]

是否可以直接从 Visual Studio 加载一个 ASPX 文件(我正在构建一个加载项),或者这是否包含 XML 错误,我是否必须加载输出 HTML 流(即 文件开头没有页面声明,。)?

【问题讨论】:

  • 好问题 (+1)。有关详细说明和要使用的正确 XPath 表达式,请参阅我的答案。 :)

标签: html xpath parsing html-agility-pack


【解决方案1】:

问题出在SelectNodes()的参数中:

//[@id='{0}']

(执行替换后)不是语法上合法的 XPath 表达式。所以问题不在于 XPath 表达式“不返回任何节点”——问题在于它在语法上是非法的。

根据 XPath W3C 规范:

///descendant-or-self::node()/的缩写”

因此上面的扩展为:

/descendant-or-self::node()/[@id='{0}']

请注意,最后一个定位步骤没有节点测试并以谓词开头。根据 XPath 的语法规则,这是非法的。

可能你想要

//*[@id='{0}']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多