il pacchetto di agilità html ottiene il testo interno di td di un prossimo tr

c# html-agility-pack xpath

Domanda

Ho qualche problema con il pacchetto di agilità html che ho generato in modo casuale trs con la stessa classe = "related-news" ripetuto in uno o più di un tavolo ma non necessariamente si susseguono e il più delle volte ci sono trs con nessuna classe tra di loro. Quello che sto cercando di fare è ottenere il testo interiore del td di quei trs senza classe e metterli insieme in un array insieme alla tr class = "related-news" che è proprio sopra di loro

Questo è l'html

<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>

Non c'è modo di sapere quanti trs senza classe saranno gerenati tra trs con classe "related-news" Ho bisogno di ottenere il testo interno di tutti i tds e non ho promblem con il problema di separarli ogni volta Raggiungo il tr con classe "related-news"

qualcosa come questo:

se questo ha una classe "related-news" ottiene il testo interno di questo trs e il testo interno dei successivi trs mentre non hanno classe "related-news" se viene raggiunta una classe tr con "related-news" crea una nuova arrey e Continua

questo è possibile anche con il pacchetto di agilità html?

Ottengo il testo interno di ogni td con questo codice:

HtmlNodeCollection nodes2 = doc.DocumentNode.SelectNodes("//tr[@class='related-news']/td");
        foreach (HtmlNode node in nodes2)
        {
            string Text = node.InnerText;
        }

Non so come continuare o aggiungere una condizione

Risposta popolare

Questa è solo una manifestazione di un'operazione piuttosto comune: passare attraverso una lista sequenziale e combinare le cose.

L'idea di base sarebbe quella di ottenere tutti i nodi <tr> , non solo i nodi "related-news". Quindi, si passa all'elenco e si raggruppano. Lo pseudo-codice qui sotto mostra come è fatto.

List<string> TextLines = new List<string>();
StringBuilder sb = new StringBuilder();
foreach (var node in nodes)
{
    if node class == "related-news"
    {
        // we've found a new "related-news" node.
        // add the previous stuff to the list
        if (sb.Length > 0)
            TextLines.Add(sb.ToString());
        sb = new StringBuilder(node.InnerText);
    }
    else
    {
        sb.Append(node.InnerText);
    }
}
// and don't forget the last one
if (sb.Length > 0)
    TextLines.Add(sb.ToString());

Nota che il codice si preoccupa solo dei tag <tr> che hanno classe "related-news" e quelli che non lo fanno. Se ci sono altre classi che desideri raggruppare in modo diverso, dovresti modificare il codice.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow