HTMLAgilityPack C # Получить все узлы и подузлы - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь удалить некоторые данные с этой веб-страницы, но у меня возникли некоторые проблемы.Я хотел бы получить только 3 узла данных, 1 для названия команды, 1 для очков и 1 для позиции.Таким образом, пример вывода на консоль должен выглядеть примерно так:

Ута 23,52 Центра
Ута 29,22 Силовые форварды
Ута 29,86 Очки защиты
Ута 26,22 Маленький форвард
Ута26.61 Shooting Guard

Я разработал приведенный ниже код, но циклы 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 голосов
/ 23 октября 2018

Ваша главная проблема - подход с 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]);
    }
...