Получение текста с узла с помощью HtmlAgilityPack

c# html-agility-pack xpath

Вопрос

У меня есть следующий HTML:

<div class="top">
    <p>Blah.</p>
    I want <em>this</em> text.
</div>

Что такое обозначение XPath для извлечения строки « I want <em>this</em> text. »?? EDIT: я не обязательно хочу, чтобы одно выражение XPath извлекало строку. Выбор нескольких узлов и их повторение для создания предложения также были бы замечательными.

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(myHtml);
doc.DocumentNode.SelectSingleNode("??????");

Принятый ответ

Что вы хотите извлечь, узлы или строку?

Если вам нужны узлы, "I want <em>this</em> text." представляет собой фрагмент XML, состоящий из верхнего уровня двух текстовых узлов и элемента <em> , который имеет дочерний элемент текстового узла. Поскольку он имеет несколько узлов на верхнем уровне, вам нужно использовать SelectNodes("xpath expression a la @Alejandro") а не SelectSingleNode() чтобы извлечь их.

Если вам нужна строка, снова вам нужно использовать SelectNodes (); а затем перебирать выбранные узлы и конкатенировать внешнийHTML каждого из них. См. Здесь хороший пример чего-то подобного.

Кроме того, из вашего примера немного непонятно, что выражение XPath в общем даст вам то, что вы хотите. Например, вы хотите все после начального <p>...</p> разделе <div class="top"> ? Или вы хотите, чтобы весь текст находился под элементами <div> кроме всех <p> ? Или может быть что-то еще? Конечно, если для вас работают выражения Xathath Алехандро, то это уже достаточно хорошо указано.


Популярные ответы

/div[@class='top']/p[.='Blah.']/following-sibling::node()

или

/div[@class='top']/node()[not(self::p)]


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему