HTMLAgilityPack C#获取所有节点和子节点

时间:2018-10-23 16:29:55

标签: c# html-agility-pack

我正在尝试从该网页上抓取一些数据,但在操作时遇到了一些麻烦。我只想获取3个节点数据,其中1个用于团队名称,1个用于积分,1个用于位置。因此,控制台输出的示例将类似于以下内容:

犹他州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 { }

    }

1 个答案:

答案 0 :(得分:2)

您的主要问题是使用foreach的方法,您告诉您的代码是对每个团队来说,给我所有分数,而对每一点给我所有职位。  由于团队的得分和得分是相同的,因此我的方法是解决这个问题,因为棘手的是位置,但是同样,您知道每个位置只有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]);
    }