2010-11-01 2 views
1

У меня есть следующий HTML:Получение текста из узла, используя HtmlAgilityPack

<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("??????"); 

ответ

1

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

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

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

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

+0

Я хочу извлечь строку «Я хочу это text.'» – grautur

+0

Использование SelectNodes() и итерация по каждому узлу, если нужно. – grautur

+0

@grautur: ok ... см. Пример, с которым я связан в своем последнем редактировании. Мне сложно найти документацию для набора гибкости HTML ... знаете ли вы, где он находится? Я загрузил файл справки chm, но он, похоже, не работает в Windows 7. – LarsH

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

или

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

@Alejandro, он поставил XPath внутри SelectSingleNode(), но ни одно выражение XPath не даст ему результат, который он хочет. – LarsH

+0

@Alejandro: Это дает мне «Я хочу», но не остальную часть предложения. @LarsH: Это не должно быть SelectSingleNode, я просто ищу любой способ получить все предложение (с html все еще нетронутым). – grautur

+0

О, я вижу сейчас. Это дает мне полное предложение, если я использую SelectNodes() [согласно предложению LarsH]. – grautur

Смежные вопросы