使用HtmlAgilityPack(Linq)解析html表

使用HtmlAgilityPack(Linq)解析html表,linq,html-table,html-agility-pack,Linq,Html Table,Html Agility Pack,以下是表格结构: <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=""&g

以下是表格结构:

<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>

可乐
可乐
可乐
2018/1/29
0.11
0.50
2018/1/30
0.22
0.55
我想得到“tr”下面的所有元素(包括“th”和“td”)

如何使用linq实现这一点

问题在于“.tr.Elements(“td | th”)……”

代码:

HtmlAgilityPack.HtmlDocument doc=新的HtmlAgilityPack.HtmlDocument();
文件加载(ms,编码.UTF8);
列表=
doc.DocumentNode.SelectSingleNode(//table[@class='tb-stock tb option'])
.后代(“tr”)
.Skip(1)
其中(tr=>tr.Elements(“th”).Count()>=1)
.Select(tr=>tr.Elements(“td | th”).Select(td=>td.InnerText.ToList())
.ToList();

您可以使用以下代码提取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);
}
HtmlDocument doc=新的HtmlDocument();
doc.Load(“test.html”,Encoding.UTF8);
列表表=
doc.DocumentNode.SelectSingleNode(//table[@class='tb-stock tb option'])
.后代(“tr”)
.Skip(1)
其中(tr=>tr.Elements(“th”).Count()>=1)
.SelectMany(tr=>tr.ChildNodes)
.Where(node=>“td | th.”包含(node.Name))
.Select(node=>node.InnerText)
.ToList();
foreach(表中的var str)
{
控制台写入线(str);
}

您能试着放置或调节吗<代码>“td或th”它不工作。有没有办法将“tr”中的所有元素都放到一个列表中?谢谢Emre,这是本主题的解决方案之一!
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);
}