C# 一次获取所有子节点



我正在尝试获取维基表的2首行(标题(。特别是以下链接中的"Lista Episodi"下的表格:https://it.wikipedia.org/wiki/Episodi_di_Dragon_Ball_Super 第一行是:

<table class="wikitable" style="width:auto">
<tbody> 
<tr>
<th style="width:auto;white-space:nowrap" rowspan="2">Nº
</th>
<td style="background:#eaecf0;text-align:left;width:auto" rowspan="2">
<b><a title="Lingua italiana" href="/wiki/Lingua_italiana">Titolo italiano</a>
</b> 
<br>
<b>
<a title="Lingua giapponese" href="/wiki/Lingua_giapponese">Giapponese</a>
</b> 
「
<i>
<b><a title="Kanji" href="/wiki/Kanji">Kanji</a></b></i>
」 - 
<i>
<b>
<a title="Rōmaji" href="/wiki/R%C5%8Dmaji">Rōmaji</a>
</b>
</i>
- 
<b>
<a title="Traduzione" href="/wiki/Traduzione">Traduzione letterale</a>
</b>
</td>
<th colspan="2">In onda</th>
</tr>
</tbody>
</table>

我有一个工作代码,可以正确获取整个标头并将其放入列表中:

HtmlDocument doc = new HtmlDocument();
string page = "https://it.wikipedia.org/wiki/Episodi_di_Modern_Family_(prima_stagione)";
string page1 = "https://it.wikipedia.org/wiki/Episodi_di_Dragon_Ball_Super";
StreamReader reader;
reader = new StreamReader(WebRequest.Create(page1).GetResponse().GetResponseStream(), Encoding.UTF8);               
doc.Load(reader);
List<List<string>> header = doc.DocumentNode.SelectSingleNode("//table[@class='wikitable']").Descendants("tr")
.Where(ld => ld.Elements("th").Count() > 0)
.Select(ld => ld.Elements("th").Select(td => td.InnerText.Trim()).ToList()).ToList();

不幸的是,在此表中还有一个 td 节点,而不是只有 th-node,即使它是一行标题。前面的代码只能读取第 th 节点。 如何同时使用 2 个节点和 td 节点?我尝试了类似的东西:

List<List<string>> header = doc.DocumentNode.SelectSingleNode("//table[@class='wikitable']").Descendants("tbody")
.Where(ld => ld.Elements("tr").Count() > 0)
.Select(ld => ld.Elements("tr").Select(td => td.InnerText.Trim()).ToList()).ToList();

它获取所有 3 个子节点,但 3 个内容全部放在一个字符串中。你可以帮我吗?

你获取tr标签的内容,但你需要把它展平。尝试这样的事情:

List<List<string>> header2 = doc.DocumentNode.SelectSingleNode("//table[@class='wikitable']")
.Descendants("tr")
.Select(x=>x.ChildNodes
.Select(c=>c.InnerText.Trim())
.Where(y=>!string.IsNullOrWhiteSpace(y))
.ToList())
.ToList();

最新更新