使用Htmlagilitypack + LINQ + Lambda提取表

时间:2013-11-11 19:48:26

标签: c# linq lambda html-agility-pack

我在使用lambda表达式解析html表时遇到了一些困难。

var cells = htmlDoc.DocumentNode
                .SelectNodes("//table[@class='data stats']/tbody/tr")
                .Select(node => new { playerRank = node.InnerText.Trim()})
                .ToList();
            foreach (var cell in cells)
            {
                Console.WriteLine("Rank: " + cell.playerRank);
                Console.WriteLine();
            }

我想继续使用语法

.Select(node => new { playerRank = node.InnerText.Trim()

但是对于表格的其他类别,例如玩家名称,团队,位置等。我正在使用Xpath,所以我不确定它是否正确。

我在查找如何从以下位置提取链接+播放器名称时遇到问题:

<a href="/ice/player.htm?id=8474564">Steven Stamkos</a>

它的X路是:

//*[@id="fullPage"]/div[3]/table/tbody/tr[1]/td[2]/a

任何人都可以帮忙吗?

EDIT *添加了HTML页面。 http://www.nhl.com/ice/playerstats.htm?navid=nav-sts-indiv#

1 个答案:

答案 0 :(得分:0)

这应该让你开始:

var result = (from row in doc.DocumentNode.SelectNodes("//table[@class='data stats']/tbody/tr")
                         select new
                         {
                             PlayerName = row.ChildNodes[1].InnerText.Trim(),
                             Team = row.ChildNodes[2].InnerText.Trim(),
                             Position = row.ChildNodes[3].InnerText.Trim()
                         }).ToList();

ChildNodes属性包含每行的所有单元格。索引确定您获得的单元格。

要从播放器名称单元格中包含的锚标记中获取网址:

var result = (from row in doc.DocumentNode.SelectNodes("//table[@class='data stats']/tbody/tr")
                          select new
                          {
                              PlayerName = row.ChildNodes[1].InnerText.Trim(),
                              PlayerUrl = row.ChildNodes[1].ChildNodes[0].Attributes["href"].Value,
                              Team = row.ChildNodes[2].InnerText.Trim(),
                              Position = row.ChildNodes[3].InnerText.Trim()
                          }).ToList();

Attributes集合是HTML元素中的属性列表。我们只是抓住href的值。