pack d'agilité html obtenir le texte interne de td du prochain tr de tr

c# html-agility-pack xpath

Question

J'ai quelques problèmes avec le pack d'agilité html, j'ai généré de manière très aléatoire avec la même classe = "related-news" répété dans un ou plusieurs tableaux, mais ils ne se suivent pas nécessairement et la plupart du temps, ils sont très pas de classe entre eux. Ce que j'essaie de faire est d'obtenir le innerText des td de ceux qui n'ont pas de classe et de les mettre ensemble dans un tableau avec le tr class = "related-news" qui se trouve juste au-dessus d'eux.

C'est le 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>

Il n’existe aucun moyen de savoir combien de classes sans classe seront générées entre des classes avec "related-news". Je dois obtenir le texte interne de tous les tds et je n’ai aucune promesse que le problème est de les séparer à chaque fois J'arrive au tr avec la classe "related-news"

quelque chose comme ça:

si ce tr a la classe "related-news", obtenez le innertext de ce tr et le innertext de next alors qu'ils n'ont pas la classe "related-news" si un tr avec la classe "related-news" est atteint, créez un nouvel arrey continuer

est-ce même possible avec le pack d'agilité html?

Je reçois le innertext de chaque td avec ce code:

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

Je ne sais pas comment continuer ou ajouter une condition

Réponse populaire

Ceci est juste la manifestation d'une opération assez commune: parcourir une liste séquentielle et combiner des choses.

L'idée de base serait d'obtenir tous les nœuds <tr> , pas seulement les nœuds "related-news". Ensuite, vous parcourez la liste et les regroupez. Le pseudo-code ci-dessous montre comment faire.

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());

Notez que le code ne concerne que les balises <tr> ayant la classe "related-news" et celles qui ne le sont pas. Si vous souhaitez grouper différemment d'autres classes, vous devez modifier le code.



Related

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