Внутренний текст узла, игнорирующий внутренний текст детей

c# html-agility-pack xpath

Вопрос

Простите меня, если это звучит слишком просто, чтобы вас спросили здесь, но так как это мой первый день с html-agility-pack, я не могу разобраться в выборе внутреннего текста узла, который является прямым потомком узла и игнорирование внутреннего текста дочерних узлов.

Например

<div id="div1">
   <div class="h1"> this needs to be selected
   <small> and not this</small>
   </div>
</div>

в настоящее время я пытаюсь это

HtmlDocument page = new HtmlWeb().Load(url);
var s = page.DocumentNode.SelectSingleNode("//div[@id='div1']//div[@class='h1']");
string selText = s.innerText;

который возвращает весь текст (например, это нужно выбрать, а не это). Какие-либо предложения??

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

Вы можете использовать параметр /text() чтобы получить все текстовые узлы непосредственно под определенным тегом. Если вам нужен только первый, добавьте к нему [1] :

page.LoadHtml(text);
var s = page.DocumentNode.SelectSingleNode("//div[@id='div1']//div[@class='h1']/text()[1]");
string selText = s.InnerText; 

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

У div может быть несколько текстовых узлов, если есть текст до и после его дочерних элементов. Как я здесь указал, я считаю, что лучший способ получить прямое текстовое содержимое узла - это сделать что-то вроде:

HtmlDocument page = new HtmlWeb().Load(url);
var nodes = page.DocumentNode.SelectNodes("//div[@id='div1']//div[@class='h1']/text()");

StringBuilder sb  = new StringBuilder();
foreach(var node in nodes)
{
   sb.Append(node.InnerText);
}

string content = sb.ToString();


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow