Texto interno del nodo ignorando el texto interno de los niños

c# html-agility-pack xpath

Pregunta

Perdone si suena demasiado simple para ser preguntado aquí, pero como este es mi primer día con html-agility-pack, no puedo encontrar una manera de seleccionar el texto interno de un nodo que es el hijo directo del nodo e ignorando el texto interno de los nodos hijos.

Por ejemplo

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

actualmente estoy intentando esto

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

que devuelve el texto completo (por ejemplo, esto debe seleccionarse y no esto). ¿¿Alguna sugerencia??

Respuesta aceptada

Puede usar la opción /text() para obtener todos los nodos de texto directamente bajo una etiqueta específica. Si solo necesita el primero, agregue [1] :

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

Respuesta popular

El div podría tener múltiples nodos de texto si hay texto antes y después de sus hijos. Como indiqué de manera similar aquí , creo que la mejor manera de obtener todo el contenido de texto directo de un nodo es hacer algo como:

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

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow