Comment puis-je obtenir le code HTML entre 2 éléments HTML environnants avec htmlagilitypack?

asp.net c# html-agility-pack

Question

J'ai besoin de récupérer les éléments HTML contenus dans 2 autres éléments HTML à l'aide de HTMLagilitypack avec C #.

Par exemple, j'ai les éléments suivants:

<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>

Je veux tout retourner entre

<div id="div1">

et le premier

<br>

sans retourner aucun de ces éléments.

Je ne comprends pas très bien la syntaxe requise. Si quelqu'un pouvait m'expliquer le meilleur moyen d'obtenir le code HTML existant entre 2 autres balises de début connues en ignorant les balises de fin, je l'apprécierais vraiment.

Je devrais également mentionner que je dois d'abord trouver la div avec l'id de div1 dans le code HTML environnant d'une page Web complète.

Je n'ai pas besoin que les noeuds réels aient une égalité de référence avec les noeuds provenant d'un document HtmlDocument spécifique , ils doivent simplement avoir le même contenu.

Réponse acceptée

Lorsque des instances HtmlNode sont renvoyées, plusieurs appels pour le même nœud produiront la même référence. Vous pouvez utiliser ceci à votre avantage (bien que ce soit un détail d'implémentation, alors soyez prudent).

En gros, vous obtiendrez tous les descendants qui sont des éléments jusqu'au nœud en question. Vous sélectionnez le nœud de départ:

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

Le noeud sur lequel vous voulez aller:

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

Et utilisez ensuite la méthode d’extension TakeWhile sur la classe Enumerable pour prendre tous les éléments jusqu’au deuxième élément, comme Enumerable :

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

C'est la comparaison dans la méthode TakeWhile ( n => n != brNode ) qui dépend de la comparaison de référence (c'est la partie de détail d'implémentation).

Le dernier filtre consiste à ne vous donner que des nœuds d’éléments, car c’est ce que vous obtiendriez généralement avec des appels à SelectSingleNode ; si vous souhaitez traiter d'autres types de nœuds, vous pouvez l'omettre.

En parcourant ces nœuds comme ceci:

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

Produit:

Node: strong
Node: font
Node: font


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow