Нередко пользователям интернета необходимо скопировать большое количество картинок, текста или названий с определенного сайта. Тупой и монотонный copy-past совершенно не подходит. Чтобы избавиться от такого нудного страдания, и существует парсинг страниц.
Существует много хороших библиотек на разные ЯП, но для быстрой разработки одним из лучших по-праву остаётся открытая библиотека html agility pack. Это .NET библиотека для работы с DOM без браузера, поддерживает селекторы XPATH и XSLT парсинг.
Для примера её использования создадим новый проект, в моем случае это будет windows forms. Добавим нужную ссылку необходимой версии в reference. В начале проекта вставим следующий код:
using HtmlAgilityPack;
using HtmlDocument = HtmlAgilityPack.HtmlDocument;
Иногда случаются проблемы с ресурсами которые не закодированы в utf-8. Тогда всплывают всякие кракозябры и их приходится конвертировать в читаемый формат. К сожалению, встроенный метод LoadHtml, входящий в коробку, пока не поддерживает перегрузки автоматической кодировки. Поэтому, потратив время на решение парсинга ANSI/Windows страниц, нашёл довольно элегантное решение на StackOverflow:
string html = "http://site.domain";
HtmlDocument HD = new HtmlDocument();
var web = new HtmlWeb
{
AutoDetectEncoding = false,
OverrideEncoding = Encoding.UTF8,
};
HD = web.Load(html);
// Собственно, здесь и производится выборка интересующих нам нодов
// В данном случае выбираем блочные элементы с классом eTitle
HtmlNodeCollection NoAltElements = HD.DocumentNode.SelectNodes("//div[@class='eTitle']");
// Проверяем наличие узлов
if (NoAltElements != null)
{
foreach (HtmlNode HN in NoAltElements)
{
// Получаем строчки
string outputText = HN.InnerText;
}
}
На выходе можно получать целиком html, вместе с тегами и классами, тогда вместо InnerText надо поставить InnerHtml. Не забывайте, что некоторые ресурсы могут банить по IP по причине слишком высокого потока запросов. Этим грешат некоторые CMS, например, uCoz.
Пример приложения с исходниками можно скачать здесь.