html agility pack получает внутренний текст td tr tr следующего tr

c# html-agility-pack xpath

Вопрос

У меня возникли проблемы с пакетом гибкости html. Я случайно генерировал trs с тем же классом = «related-news», который повторялся в одной или нескольких таблицах, но они не обязательно следуют друг за другом, и большую часть времени есть trs с между ними нет класса. То, что я пытаюсь сделать, это получить innerText из td этих trs без класса и объединить их в массив вместе с tr class = "related-news", который находится прямо над ними

Это 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>

Нет никакого способа узнать, сколько trs без класса будет gerenated между trs с классом «related-news» Мне нужно получить внутренний текст всех tds, и у меня нет проспекта, что проблема состоит в том, чтобы разделить их каждый раз Я добираюсь до tr с помощью класса «related-news»

что-то вроде этого:

если этот tr имеет класс «related-news», получите внутренний текст t tr и внутренний текст следующих trs, в то время как у них нет класса «related-news», если tr с классом «related-news» достигнут, создайте новый arrey и Продолжать

возможно ли это с помощью пакета html agility pack?

Я получаю внутренний текст каждого td с помощью этого кода:

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

Я не знаю, как продолжить или добавить условие

Популярные ответы

Это всего лишь проявление довольно распространенной операции: переход через последовательный список и объединение вещей.

Основная идея заключалась бы в том, чтобы получить все узлы <tr> , а не только узлы «связанные-новости». Затем вы просматриваете список и группируете их. Псевдокод ниже показывает, как это делается.

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

Обратите внимание, что код просто заботится о тегах <tr> , у которых есть связанные с классом «новости-новости», и те, которые этого не делают. Если есть другие классы, которые вы хотите группировать по-разному, вам придется изменить код.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow