HTMLAgilityPack C# 获取所有节点和子节点
HTMLAgilityPack C# Get all nodes and subnodes
我正在尝试从该网页上抓取一些数据,但遇到了一些麻烦。我想只获取3个节点数据,1个Team Name,1个points,1个position。因此,控制台输出的示例类似于:
Uta 23.52 中心
Uta 29.22 大前锋
Uta 29.86 控球后卫
Uta 26.22 小前锋
Uta 26.61 得分后卫
我设计了下面的代码,但是 foreach 循环正在复制数据,似乎是将每个值分配给每个位置、每个点等。任何帮助将不胜感激!
private void button1_Click(object sender, EventArgs e)
{
try
{
var doc = new HtmlWeb().Load("https://www.sportingcharts.com/nba/defense-vs-position/");
HtmlAgilityPack.HtmlNodeCollection teams = doc.DocumentNode.SelectNodes("//div[@class='col col-md-3']//tr/td[2]");
HtmlAgilityPack.HtmlNodeCollection points = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//tr/td[3]");
HtmlAgilityPack.HtmlNodeCollection positions = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//span[1]");
List<Record> lstRecords = new List<Record>();
foreach (HtmlAgilityPack.HtmlNode teamnode in teams)
{
foreach (HtmlAgilityPack.HtmlNode pointsnode in points)
{
foreach (HtmlAgilityPack.HtmlNode positionnode in positions)
Console.WriteLine(teamnode.InnerText + ' ' + pointsnode.InnerText + ' ' + positionnode.InnerText);
}
}
}
catch { }
}
你的主要问题是 foreach 的方法,你告诉你的代码是对于每个团队,给我所有的分数,并为每个分数给我所有的位置.
由于团队积分和积分相同,我的方法将使用 for 完成,位置变得棘手,但同样,您知道每个位置只有 30 行。
var doc = new HtmlWeb().Load("https://www.sportingcharts.com/nba/defense-vs-position/");
HtmlAgilityPack.HtmlNodeCollection teams = doc.DocumentNode.SelectNodes("//div[@class='col col-md-3']//tr/td[2]");
HtmlAgilityPack.HtmlNodeCollection points = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//tr/td[3]");
HtmlAgilityPack.HtmlNodeCollection positions = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//span[1]");
string[] positions_aux = positions.Where(x => x.InnerText.Length >= 6).Select(y => y.InnerText).ToArray();
for (int i = 0; i < teams.Count - 1; i++)
{
var aux = i / 30;
Console.WriteLine(teams[i].InnerText + ' ' + points[i].InnerText + ' ' + positions_aux[aux]);
}
我正在尝试从该网页上抓取一些数据,但遇到了一些麻烦。我想只获取3个节点数据,1个Team Name,1个points,1个position。因此,控制台输出的示例类似于:
Uta 23.52 中心
Uta 29.22 大前锋
Uta 29.86 控球后卫
Uta 26.22 小前锋
Uta 26.61 得分后卫
我设计了下面的代码,但是 foreach 循环正在复制数据,似乎是将每个值分配给每个位置、每个点等。任何帮助将不胜感激!
private void button1_Click(object sender, EventArgs e)
{
try
{
var doc = new HtmlWeb().Load("https://www.sportingcharts.com/nba/defense-vs-position/");
HtmlAgilityPack.HtmlNodeCollection teams = doc.DocumentNode.SelectNodes("//div[@class='col col-md-3']//tr/td[2]");
HtmlAgilityPack.HtmlNodeCollection points = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//tr/td[3]");
HtmlAgilityPack.HtmlNodeCollection positions = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//span[1]");
List<Record> lstRecords = new List<Record>();
foreach (HtmlAgilityPack.HtmlNode teamnode in teams)
{
foreach (HtmlAgilityPack.HtmlNode pointsnode in points)
{
foreach (HtmlAgilityPack.HtmlNode positionnode in positions)
Console.WriteLine(teamnode.InnerText + ' ' + pointsnode.InnerText + ' ' + positionnode.InnerText);
}
}
}
catch { }
}
你的主要问题是 foreach 的方法,你告诉你的代码是对于每个团队,给我所有的分数,并为每个分数给我所有的位置. 由于团队积分和积分相同,我的方法将使用 for 完成,位置变得棘手,但同样,您知道每个位置只有 30 行。
var doc = new HtmlWeb().Load("https://www.sportingcharts.com/nba/defense-vs-position/");
HtmlAgilityPack.HtmlNodeCollection teams = doc.DocumentNode.SelectNodes("//div[@class='col col-md-3']//tr/td[2]");
HtmlAgilityPack.HtmlNodeCollection points = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//tr/td[3]");
HtmlAgilityPack.HtmlNodeCollection positions = doc.DocumentNode.SelectNodes(".//div[@class='col col-md-3']//span[1]");
string[] positions_aux = positions.Where(x => x.InnerText.Length >= 6).Select(y => y.InnerText).ToArray();
for (int i = 0; i < teams.Count - 1; i++)
{
var aux = i / 30;
Console.WriteLine(teams[i].InnerText + ' ' + points[i].InnerText + ' ' + positions_aux[aux]);
}