Cómo obtener texto que no tiene etiqueta con htmlAgilityPack

c# html html-agility-pack xpath

Pregunta

Tengo un archivo html como abajo

  <div>

  <div style="margin-left:0.5em;">
  <div class="tiny" style="margin-bottom:0.5em;">
  <b><span class="h3color tiny">This review is from: </span>You Meet</b>
  </div>
  If you know Ron Kaufman as I do ...
  <br /><br />Whether you're the CEO....
  <br /><br />Written in a distinctive, ...
  <br /><br />My advice? Don't just get one copy
  <div style="padding-top: 10px; clear: both; width: 100%;"></div>
  </div>

  <div style="margin-left:0.5em;">
  <div class="tiny" style="margin-bottom:0.5em;">
  <b><span class="h3color tiny">This review is from: </span>My Review</b>
  </div>
  I became a fan of Ron Kaufman after reading an earlier book of his years ago...
  <div style="padding-top: 10px; clear: both; width: 100%;"></div>
  </div>

  </div>

Quiero obtener un texto de revisión que no tenga ninguna etiqueta html. Estoy usando el siguiente código ahora

  foreach (HtmlNode divReview in doc.DocumentNode.SelectNodes(@"//div[@style='margin-left:0.5em;']"))   
   {
      if (divReview != null)
          {

 review.Add(divReview.Descendants("div").Where(d => d.Attributes.Contains("style") && 
 d.Attributes["style"].Value.Contains("padding-top: 10px; clear: both; width: 100%;")).
                                          Select(d =>
 d.PreviousSibling.InnerText.Trim()).SingleOrDefault());  
          }
       }

que solo devuelve "¿Mi consejo? No solo obtenga una copia", ¿cómo puedo obtener el texto completo?

Actualización: Incluso si elimino todos

"br"

etiqueta de htmlnode, aún cuando use el código anterior, solo obtengo la parte de "¿Mi consejo? ¡No solo obtenga una copia"! ¿cualquier comentario?

Respuesta aceptada

He actualizado el código para esto:

var allText = (reviewDiv.Descendants("div")
  .First(div => div.Attributes["style"].Value == "padding-top: 10px; clear: both; width: 100%;")
  .SelectNodes("./preceding-sibling::text()") ?? new HtmlNodeCollection(null)) 
  .Select(text => text.InnerText);

Esto debería devolver un IEnumerable de cadenas con el texto que precede a la división con el estilo intrincado.

Sin tener un poco más del HTML que lo rodea, es difícil saber si esto es exactamente lo que está buscando. Actualmente estoy adivinando que ha seleccionado un div y que ese div es el padre directo de todo el bloque de texto (dada su referencia a un reviewDiv). Su muestra de HTML no parece contener este fragmento de HTML, por lo que estoy haciendo algunas suposiciones aquí.

Con la siguiente entrada:

<div><div class="tiny" style="margin-bottom:0.5em;">
<b><span class="h3color tiny">This review is from: </span>You Meet</b>
</div>
If you know Ron Kaufman as I do ...
<br /><br />Whether you're the CEO....
<br /><br />Written in a distinctive, ...
<br /><br />My advice? Don't just get one copy
<div style="padding-top: 10px; clear: both; width: 100%;"></div></div>

Extrae esto:

Si conoces a Ron Kaufman como yo ...
Si eres el CEO ...
Escrito en un distintivo, ...
¿Mi consejo? No se limite a obtener una copia.

Para construir una sola cadena utilicé: string extractedText = string.Join("", allText);



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué