Ich habe einige Probleme mit HTML-Agilität-Paket Ich habe zufällig generierte trs mit der gleichen Klasse = "related-News" in einer oder mehreren Tabellen wiederholt, aber sie sind nicht unbedingt aufeinander folgen und die meiste Zeit gibt es Trs mit keine Klasse zwischen ihnen. Was ich versuche, ist, den inneren Text der TDs dieser TRS ohne Klasse zu bekommen und sie zusammen mit der tr class = "related-news", die direkt über ihnen liegt, in einem Array zusammenzufassen
Dies ist der HTML-Code
<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>
Es gibt keine Möglichkeit zu wissen, wie viele trs ohne Klasse zwischen trs mit Klasse "related-news" gerendert werden. Ich brauche den inneren Text aller tds und ich habe keine Probleme damit, dass das Problem darin besteht, sie jedes Mal zu trennen Ich erreiche den tr mit der Klasse "related-news"
etwas wie das:
wenn dieser tr Klasse "related-news" hat, erhalten Sie den inneren Text und den inneren Text des nächsten trs, während sie keine Klasse "related-news" haben, wenn ein tr mit "related-news" Klasse erreicht wird, erstellen Sie einen neuen arrey und fortsetzen
ist das mit html agility pack überhaupt möglich?
Ich bekomme den inneren Text von jedem TD mit diesem Code:
HtmlNodeCollection nodes2 = doc.DocumentNode.SelectNodes("//tr[@class='related-news']/td");
foreach (HtmlNode node in nodes2)
{
string Text = node.InnerText;
}
Ich weiß nicht, wie ich weitermachen oder eine Bedingung hinzufügen soll
Dies ist nur eine Manifestation einer ziemlich üblichen Operation: Durchlaufen einer sequentiellen Liste und Kombinieren von Dingen.
Die Grundidee wäre, alle <tr>
Knoten zu bekommen, nicht nur die "related-news" Knoten. Dann gehen Sie die Liste durch und gruppieren sie. Der Pseudocode unten zeigt, wie es gemacht wird.
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());
Beachten Sie, dass der Code nur für <tr>
-Tags mit der Klasse "related-news" und solche, die dies nicht tun. Wenn es andere Klassen gibt, die Sie anders gruppieren möchten, müssen Sie den Code ändern.