¿Cómo puedo obtener el html entre los 2 elementos html que lo rodean usando htmlagilitypack?

asp.net c# html-agility-pack

Pregunta

Tengo una necesidad de recuperar los elementos html que están contenidos dentro de otros 2 elementos html usando htmlagilitypack con C #.

Como ejemplo, tengo lo siguiente:

<div id="div1" style="style definition here">
  <strong>
    <font face="Verdana" size="2">Your search request retrieved 0 matches.</font>
  </strong>
  <font face="Verdana" size="2">Some more text here.</font>
  <br><br>
  <!--more html here-->
</div>

Quiero devolver todo entre

<div id="div1">

y el primero

<br>

Sin devolver ninguno de esos elementos.

No puedo entender la sintaxis requerida para esto, así que si alguien me pudiera explicar la mejor manera de obtener el html que existe entre otras 2 etiquetas de inicio conocidas mientras ignora las etiquetas finales, realmente lo agradecería.

También debo mencionar que primero debo encontrar el div con el id de div1 dentro del html de una página web completa.

No necesito que los nodos reales tengan igualdad de referencia con los nodos que provienen de un HtmlDocument específico , solo tienen que ser del mismo contenido.

Respuesta aceptada

Cuando se HtmlNode instancias de HtmlNode , varias llamadas para el mismo nodo producirán la misma referencia. Puede usar esto para su ventaja (aunque es un detalle de implementación, así que tenga cuidado).

Básicamente, obtendrías todos los descendientes que son elementos hasta el nodo en cuestión. Seleccionas el nodo para empezar:

HtmlNode divNode = doc.DocumentNode.SelectSingleNode("div[@id='div1']");

El nodo al que quieres subir:

// Note that in this case, working off the first node is not necessary, just
// convenient for this example.
HtmlNode brNode = divNode.SelectSingleNode("br");

Y luego use el método de extensión TakeWhile en la clase Enumerable para tomar todos los elementos hasta el segundo elemento, así:

// The nodes.
IEnumerable<HtmlNode> nodes = divNode.Descendants().
    TakeWhile(n => n != brNode).
    Where(n => n.NodeType == HtmlNodeType.Element);

Es la comparación en el método TakeWhile ( n => n != brNode ) que depende de la comparación de referencia (esa es la parte detallada de la implementación).

El último filtro es darle solo nodos de elementos, ya que eso es lo que normalmente obtendría con las llamadas a SelectSingleNode ; Si desea procesar otros tipos de nodo, puede omitir eso.

Ciclismo a través de esos nodos como este:

foreach (HtmlNode node in nodes)
{
    // Print.
    Console.WriteLine("Node: {0}", node.Name);
}  

Produce:

Node: strong
Node: font
Node: font


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é