воскресенье, 3 ноября 2013 г.

Парсинг сайтов на C#.

Для одного из своих приложений мне понадобилось достаточно много информации которой полно на различных wiki но всё это собирать вручную достаточно геморно. По этому я решил вооружится C# и распарсить всё что мне надо.  Мы будем использовать хорошую библиотеку Html Agility Pack которая берёт на себя большую часть работы и предоставляет для нас удобное DOM дерево с которым мы можем работать. Она поддерживает XPath запросы, LINQ и много всего вкусного.

Начинаем работу. 

Вам понадобиться знание HTML и желательно опыт работы с XML, иначе вы вряд-ли сможете понять в полной мере описанное ниже. Для начала нам нужно скачать библиотеку и подключить её к проекту, для этого берём из архива папку под нужный нам фреймворк я взял Net40 и ложем её в наш проект (перетягиваем в окошко обозреватель решения). Далее кликаем правой кнопкой мыши на Reference всё в том же обозревателе решений и нажимаем добавить ссылку. Там на вкладке обзор нужно выбрать нашу библиотеку 

Работаем собственно

В качестве подопытного у нас выступит сайт dota2.ru и мы попробуем получить ссылки на страницы всех героев для последующей их обработки. Обработка самих страниц с героями не сильно отличается от обработки страницы с их каталогом. Сперва нам нужно определится с структурой страницы. К слову с этим сайтом всё достаточно просто, так-как структура хорошо продуманна и все элементы имеют свою названия, из-за чего всё сводится к XPath запросу и пробежки циклом. Все ссылки на страницы расположены в дивах с классом "list"








 Так, прежде чем приступить к парсингу проведём пару подготовительных операций. Для начала переменные :
       public static WebClient wClient;
        //Для указания кодировки страницы
        public static Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
 Далее прямо в main используем следующий код:

            wClient = new WebClient();
            wClient.Proxy = null;
            wClient.Encoding = encode;

            var doc = new HtmlDocument();
            doc.LoadHtml(wClient.DownloadString("http://dota2.ru/heroes/"));
 Далее работаем с нашим документов как с обычной XML. Я использовал XPath запрос для нахождения всех нодов с классом "list"

var listsNode = doc.DocumentNode.SelectNodes("//div[@class='list']"); 

В теории у нас получается коллекция нодов,  все дочерние элементы этих нодов это ноды "a" с атрибутов "href" значения которого ссылка на нужную нам страницу. Переходим к перебору, далее пояснения даются в комментариях к коду.
            //перебираем все ноды с классом "list"
            foreach (HtmlNode s in listsNode)
            {
                //перебираем все дочернии ноды нода.
                foreach (HtmlNode aNode in s.ChildNodes)
                {
                    //на всякий случай проверяем не подсунули ли на чего-то не того.
                    if (aNode.Name == "a")
                    {
                        //получаем все атрибуты с именнем href (вообще-то он вероятней всего будет 1)
                        var hrefs = aNode.Attributes.AttributesWithName("href");
                        foreach (HtmlAttribute hrefAttribute in hrefs)
                        {
                             //Выводим ссылку в консольку.
                            HeroesPages.Add(hrefAttribute.Value);
                        }
                    }
                }
            }
В итоге у нас получится вот что

Комментариев нет:

Отправить комментарий