Нужна помощь в доступе к определенным атрибутам на веб-странице (Web Scraper) - PullRequest
0 голосов
/ 12 февраля 2020

Я разрабатываю консольное приложение для веб-скребка, используя c#, и у меня, похоже, возникают проблемы с получением определенного текста на странице с использованием того же объекта, а не с созданием нового.

Так, как я Я делаю это прямо сейчас ниже:

        public static async void GetPosts()
    {

        var siteUrl = "https://news.ycombinator.com/";

        HttpClient httpClient = new HttpClient();
        var data = await httpClient.GetStringAsync(siteUrl);

        var htmlDocument = new HtmlDocument();
        htmlDocument.LoadHtml(data);

        var postsHTML = htmlDocument.DocumentNode.Descendants("table")
            .Where(node => node.GetAttributeValue("class", "")
            .Equals("itemlist")).ToList();

        var postList = postsHTML[0].Descendants("tr")
            .Where(node => node.GetAttributeValue("class", "")
            .Equals("athing")).ToList( );

        //var postSubText = postsHTML[0].Descendants("td")
            //.Where(node => node.GetAttributeValue("class", "")
            //.Equals("subtext")).ToList();



        foreach (var post in postList)
        {

            var storylink = post.Descendants("a")
                .Where(node => node.GetAttributeValue("class", "")
                .Equals("storylink")).FirstOrDefault();

            Console.WriteLine("Title: " + storylink.InnerText);
            Console.WriteLine("URI: " + storylink.GetAttributeValue("href", ""));

           // var subtext = post.Descendants("td")
             //   .Where(node => node.GetAttributeValue("class", "")
             //   .Equals("hnuser ")).FirstOrDefault();

            // Console.WriteLine("Author: " + subtext.InnerText);

            Console.WriteLine();

        }

    }

}


}





            //foreach (var subText in postSubText)
            //{ 

            //Console.WriteLine("Author: " + subText.Descendants("a")
            //        .Where(node => node.GetAttributeValue("class", "")
            //        .Equals("hnuser")).FirstOrDefault().InnerText);

            //    Console.WriteLine();
            //}

Теперь, если вы посмотрите на объект postlist, который в идеале приносит все сообщения по этой ссылке. Теперь по какой-то причине автор не может получить доступ к комментариям et c под тем же объектом. Мне нужно создать новый объект массивов для других текстовых элементов, которые я хочу получить, поэтому мне нужно создать еще один для каждого l oop. Есть ли способ, которым это можно сделать за один l oop? Сначала я подумал о слиянии двух массивов, но это почему-то не сработало. Когда я использую объект для подтеста, который я создаю в для каждого l oop, я не получаю обратно автора, я получаю нулевое возвращение.

...