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