Вот способ, которым я могу это сделать:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table"))
{
Console.WriteLine("Table: ");
foreach (HtmlNode tbody in table.SelectNodes("tbody"))
{
if (tbody.ChildNodes.Any(x => x.Name == "tr"))
{
Console.WriteLine("TBody: ");
foreach (HtmlNode cell in tbody.SelectNodes("tr"))
{
Console.WriteLine("TR: ");
if (cell.ChildNodes.Any(c => c.Name == "td"))
{
foreach (var item in cell.SelectNodes("td"))
{
Console.WriteLine("TD: ");
Console.WriteLine(item.InnerHtml);
}
}
Console.WriteLine();
}
}
}
}
Таким образом, не имеет значения, сколько существует тегов tr или td.Стоит отметить, что вы должны добавить проверку, если есть случай, когда в теле нет тегов tr или td.
Надеюсь, это поможет.
Отредактировано для включения проверки для тегов tr и td.Аналогичная логика может использоваться для всех других тегов, которые могут отсутствовать.