【问题标题】:Parse html table using HtmlAgilityPack (Linq)使用 HtmlAgilityPack (Linq) 解析 html 表
【发布时间】:2019-01-26 04:32:19
【问题描述】:

这是表结构:

<table class="tb-stock tb-option">
<tr>
    <th class="bgc2">col1</th>
    <th class="bgc2">col2</th>
    <th class="bgc2">col3</th>
</tr>
<tr class="alt-row">
    <th class="">2018/1/29</th>
    <td class="">0.11</td>
    <td class=" b-b">0.50</td>
</tr>
<tr class="alt-row">
    <th class="">2018/1/30</th>
    <td class="">0.22</td>
    <td class=" b-b">0.55</td>
</tr>
</table>

我想获取“tr”下面的所有元素(包括“th”和“td”)

如何使用 linq 来实现这一点?

问题位于“..tr.Elements("td|th")..”

代码:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(ms, Encoding.UTF8);

List<List<string>> table = 
doc.DocumentNode.SelectSingleNode("//table[@class='tb-stock tb-option']")
                .Descendants("tr")
                .Skip(1)
                .Where(tr => tr.Elements("th").Count() >= 1)
                .Select(tr => tr.Elements("td|th").Select(td => td.InnerText).ToList())
                .ToList();

【问题讨论】:

  • 你可以试试推杆或条件吗? "td or th"
  • 它不工作。有什么办法可以将“tr”中的所有元素放入一个List中?

标签: linq html-table html-agility-pack


【解决方案1】:

您可以使用以下代码提取 td 或 th 元素的内部文本我在本地测试它的输出是:

2018/1/29
0.11
0.50
2018/1/30
0.22
0.55

您可以过滤行中的元素:

// both td and th
.Where(node => "td|th".Contains(node.Name))
// only td
.Where(node => "td".Contains(node.Name))

工作代码是:

HtmlDocument doc = new HtmlDocument();
doc.Load("test.html", Encoding.UTF8);

List<string> table =
doc.DocumentNode.SelectSingleNode("//table[@class='tb-stock tb-option']")
    .Descendants("tr")
    .Skip(1)
    .Where(tr => tr.Elements("th").Count() >= 1)
    .SelectMany(tr => tr.ChildNodes)
    .Where(node => "td|th".Contains(node.Name))
    .Select(node => node.InnerText)
    .ToList();

foreach (var str in table)
{
    Console.WriteLine(str);
}

【讨论】:

  • 感谢 Emre,这是该主题的解决方案之一!
猜你喜欢
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多