C# Парсинг Сайта
Здравствуйте уважаемые программисты. В этой статье я попытаюсь объяснить как реализовать парсинг сайта, то есть получить нужный текст / нужную информацию с сайта или HTML-файла и выводить на экран результаты.
Для начала я создал HTML страницу, без всякого красивого дизайна, просто разместил текст на нее. Вот HTML-код нашей тестовой страницы:
Если анализировать данный код то можно заметить что тексты структурированы, т.е. сначала написан язык программирования а потом идет краткое описание и еще вся эта структура повторяется 3 раза. Я попытался архитектуру страницы представить в схематичной структуре:
Теперь с теорией закончено. Перейдем к практике. Спарсить тексты с страницы я сначала додумался до Regex, но не сильно он мне нравится честно вам скажу, уж слишком он тяжеловатый и непонятный, да и сайт должен иметь строгую структуру чтобы парсер работал. Решил я полазить в интернете за поиском более понятной альтернативы и нашел хорошую библиотеку для HTML-парсинга под названием HtmlAgilityPack. Она замечательно подходит для парсинга потому что она базируется на такими называвшихся узлами(от анг. Nodes). Это как раз то что что изображено на рисунке выше. Для получения текстов с страницы нам нужно сначала получить блоки с классом под названием "results" и их содержимое, т.е. блоки "language" и "shortdescription", а потом из каждого блока получить текст внутри div-тега. Думаю здесь все понятно, а вот как будет выглядеть код парсера:
P.S.: Если вы спросите себя что передается в методы SelectNodes и SelectSingleNode то поищите в поисковике XPath или посмотрите на сайте www.w3schools.com что это такое.
Для начала я создал HTML страницу, без всякого красивого дизайна, просто разместил текст на нее. Вот HTML-код нашей тестовой страницы:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>Test Page</title> <style type="text/css"> .results { padding-bottom: 20px; } </style> </head> <body> <div class="main_block"> <div class="results"> <div class="language">C#</div> <div class="shortdescription">C# (произносится си шарп) — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.</div> </div> <div class="results"> <div class="language">Pascal</div> <div class="shortdescription">Паскаль (англ. Pascal) — язык программирования общего назначения. Один из наиболее известных языков программирования, используется для обучения программированию в старших классах и на первых курсах ВУЗов, является базой для ряда других языков.</div> </div> <div class="results"> <div class="language">PHP</div> <div class="shortdescription">PHP (англ. PHP: Hypertext Preprocessor — «PHP: препроцессор гипертекста»; первоначально Personal Home Page Tools — «Инструменты для создания персональных веб-страниц»; произносится пи-эйч-пи) — скриптовый язык программирования общего назначения, интенсивно применяемый для разработки веб-приложений.</div> </div> </div> </body> </html>А вот как выглядит эта страница в браузере:
Если анализировать данный код то можно заметить что тексты структурированы, т.е. сначала написан язык программирования а потом идет краткое описание и еще вся эта структура повторяется 3 раза. Я попытался архитектуру страницы представить в схематичной структуре:
using System;
namespace HtmlAgilityPack
{
class Program
{
static void Main()
{
var htmlDocument = new HtmlDocument();
htmlDocument.Load(@"D:\Programming\C# Projects\2013\PowerCodX Blog\HtmlAgilityPack\HtmlAgilityPack\default.html");
HtmlNodeCollection nodes = htmlDocument.DocumentNode.SelectNodes("//div[@class='results']");
foreach (var node in nodes)
{
var languageNode = node.SelectSingleNode("div[@class='language']").InnerText;
var shortDecriptionNode = node.SelectSingleNode("div[@class='shortdescription']").InnerText;
Console.WriteLine(
"Язык программирования: {0}\r\n\r\nКраткое описание: {1}\r\n\r\n", languageNode, shortDecriptionNode);
}
Console.ReadLine();
}
}
}
Здесь происходит следующие действия: Создается HTML документ, загружается код страницы из файла (можно прямо с интернет-страницы), получаем коллекцию div-блоков с классом "results", далее из в каждого элемента коллекции "nodes" получается содержание двух div-блоков и сохраняются в переменные и в финале выводится результат на экран.P.S.: Если вы спросите себя что передается в методы SelectNodes и SelectSingleNode то поищите в поисковике XPath или посмотрите на сайте www.w3schools.com что это такое.
Ну вот и все. Если заметили грамматические ошибки или работоспособность кода нарушена пишите в комментариях или на почту: powercodx@mail.ru
Автор: PowerCodX, 2013
Бред.
RăspundețiȘtergereУ класса HtmlDocument нет конструктора, нет метода Load и нет свойства DocumentNode
Вы должны использовать HtmlDocument от библиотеки HtmlAgilityPack:
ȘtergereHtmlAgilityPack.HtmlDocument doc = new Html.AgilityPack.HtmlDocument();
И прописать в using.HtmlAgilityPack;