«Выражение должно оцениваться как набор узлов» при попытке выбрать узел HTML - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь получить определенную часть файла HTML с помощью HtmlAgilityPack.

Входной файл 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> inв моем случае), но как один узел, одна строка, содержащая весь текст.

Как я могу это сделать?

РЕДАКТИРОВАТЬ: я снова добавил тег XPath, так как возвращаемая ошибка приходит напрямуюиз System.Xml.XPath.XPathException, а не из пакета HtmlAgilityPack.

1 Ответ

0 голосов
/ 08 февраля 2019

Строка /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 (), чтобы разбить текст на границы новой строки.

...