Come posso ottenere l'html tra 2 elementi html circostanti usando htmlagilitypack?

asp.net c# html-agility-pack

Domanda

Ho bisogno di recuperare gli elementi html contenuti in altri 2 elementi html usando htmlagilitypack con C #.

Ad esempio, ho il seguente:

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

Voglio restituire tutto tra

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

e il primo

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

senza restituire nessuno di questi elementi.

Non riesco a capire la sintassi richiesta per questo, quindi se qualcuno mi può spiegare il modo migliore per ottenere l'html che esiste tra 2 altri tag di avvio noti ignorando i tag di fine, lo apprezzerei molto.

Devo anche dire che ho bisogno di trovare prima il div con l'id di div1 all'interno dell'html circostante di una pagina web completa.

Non ho bisogno che i nodi effettivi abbiano l'uguaglianza di riferimento con i nodi che provengono da uno specifico HtmlDocument , devono semplicemente essere lo stesso contenuto.

Risposta accettata

Quando vengono restituite istanze HtmlNode , più chiamate per lo stesso nodo produrranno lo stesso riferimento. Puoi usarlo a tuo vantaggio (sebbene sia un dettaglio di implementazione, quindi fai attenzione).

Fondamentalmente, otterresti tutti i discendenti che sono elementi fino al nodo in questione. Si seleziona il nodo da cui iniziare:

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

Il nodo che vuoi raggiungere:

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

E poi usa il metodo di estensione TakeWhile sulla classe Enumerable per prendere tutti gli elementi fino al secondo elemento, in questo modo:

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

È il confronto nel metodo TakeWhile ( n => n != brNode ) che dipende dal confronto di riferimento (che è la parte dei dettagli di implementazione).

L'ultimo filtro è quello di darti solo nodi elemento, in quanto è ciò che normalmente ottieni con le chiamate a SelectSingleNode ; se vuoi elaborare altri tipi di nodi, puoi ometterlo.

In bicicletta attraverso quei nodi come questo:

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

produce:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché