尝试选择HTML节点时,“表达式必须求值到节点集”

时间:2019-02-07 19:49:52

标签: vb.net xpath html-agility-pack

我正在尝试使用HtmlAgilityPack获取HTML文件的特定部分。

输入HTML文件(经过简化和清理):

<html>
<head>
</head>
<body>
    <section>
        <div>
        </div>
    </section>
    <section>
        <div>
        </div>
        Line 1
        Line 2 - Text here
        Line 3
        <div>
        </div>
    </section>
</body>
</html>

这是我的代码:

Dim getPage As HtmlDocument = webGet.Load(Uri)
Dim AllTextLines As HtmlNodeCollection = getPage.DocumentNode.SelectNodes("/html/body/section[2]/text()")
Dim SecondTextLine As HtmlNodeCollection = getPage.DocumentNode.SelectNodes("/html[1]/body[1]/section[2]/#text[2]")

设置SecondTextLine的值失败,并出现以下错误:

  

System.Xml.XPath.XPathException:表达式必须计算为节点集

我想要得到的是:

  1. 仅包含“第2行-在此处输入文字”的行
  2. 一个节中的所有文本都没有子元素(在我的情况下为<div>),但作为一个节点,一个包含所有文本的字符串。

我该怎么做?

编辑: 我再次添加了XPath标记,因为返回的错误直接来自System.Xml.XPath.XPathException,而不是来自HtmlAgilityPack。

1 个答案:

答案 0 :(得分:1)

字符串/html[1]/body[1]/section[2]/#text[2]不是有效的XPath表达式。错误的错误消息,但您当然不会希望它选择任何内容。

如果要第二个文本节点,则为/html[1]/body[1]/section[2]/text()[2]。但是,如果您想要文本“第2行-这里的文本”,那么您未选择节点,而是在节点内选择字符串,因此SelectNodes()是错误的调用方法。您似乎正在使用XPath 1.0处理器,因此在XPath表达式本身中进行字符串操作将非常困难,通常最简单的方法是将整个节点返回到宿主语言并在那里进行字符串处理。或者,切换到XPath 2.0处理器,然后可以使用tokenize()之类的功能在换行符边界上分割文本。