Cómo extraer texto dentro de una etiqueta div usando htmlagilitypack

c# html html-agility-pack winforms

Pregunta

Quiero extraer el texto "Algún texto va aquí" entre la clase div. Estoy usando el paquete de agilidad html, y c #

<div class="productDescriptionWrapper">
Some Text Goes here...
<div class="emptyClear"> </div>
</div>

Esto es lo que tengo :

Description = doc.DocumentNode.SelectNodes("//div[@class=\"productDescriptionWrapper\").Descendants("div").Select(x => x.InnerText).ToList();

Me sale este error:

An unhandled exception of type 'System.NullReferenceException' 

Sé cómo extraer si el texto es b / wa <h1> o <p> lugar de "div" en Descendientes, tendré que dar "h1" o "p".

Alguien por favor ayuda.

Respuesta aceptada

Use comillas simples como

//div[@class='productDescriptionWrapper']

Para obtener todos los descendientes de todo tipo de uso:

//div[@class='productDescriptionWrapper']//* ,

para obtener todos los descendientes de un tipo específico como p entonces use //div[@class='productDescriptionWrapper']//p .

para obtener todos los descendientes que sean div o p :

//div[@class='productDescriptionWrapper']//*[self::div or self::p] 

diga que desea obtener todos los nodos de texto descendente que no estén en blanco, luego use:

//div[@class='productDescriptionWrapper']//text()[normalize-space()]

Respuesta popular

No hay forma de obtener una excepción de referencia nula dado que el doc se crea a partir de un fragmento de código HTML que publicó. De todos modos, si quería obtener texto dentro de la <div> externa, pero no desde la interna, use xpath /text() que significa obtener nodos de texto secundarios directos .

Por ejemplo, dado este fragmento de código HTML:

var html = @"<div class=""productDescriptionWrapper"">
Some Text Goes here...
<div class=""emptyClear"">Don't get this one</div>
</div>";
var doc = new HtmlDocument();
doc.LoadHtml(html);

.. esta expresión devuelve texto desde el exterior <div> solo:

var Description = doc.DocumentNode
                     .SelectNodes("//div[@class='productDescriptionWrapper']/text()")
                     .Select(x => x.InnerText.Trim())
                     .First();
//Description : 
//"Some Text Goes here..."

... mientras que en contraste, lo siguiente devuelve todo el texto:

var Description = doc.DocumentNode
                     .SelectNodes("//div[@class='productDescriptionWrapper']")
                     .Select(x => x.InnerText.Trim())
                     .First();
//Description :
//"Some Text Goes here...
//Don't get this one"


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