пятница, 16 марта 2012 г.

Преобразование HTML в XML

programmer@xpen0ff> convert_HML2XML
The command error! Use convert_HML2XML --help for manual.
programmer@xpen0ff> convert_HML2XML --help

Задача: Преобразовать HTML-файл в XML-формат для последующего анализа данных. 

---[Help for convert_HTML2XML]--------------------------------------------------------------------------------------------------------

ЗАЧЕМ В XML?

Есть определенная страница в HTML-формате, требуется достать оттуда некоторые данные. Можно использовать регулярные выражения (RegExp), но это геморройно. Почему, читаем тут (язык - en, первый пост), а дискуссии на эту тему велись на Хабре здесь. Моё мнение такое, например есть сайт, мы берем оттуда данные и парсим в виде RegExp'ов. Выражения само собой сложные и громадные, а сайт имеет причину обновляться, периодически изменяться. Так что, если структура сайта или документа чуть поменяется, придется менять регулярное выражение, что естественно делать неохота. Но с другой стороны, если файл большой по размеру и нужно вытащить только пару тэгов, то эффективнее будет использовать регулярное выражение, потому что в этом случае не надо загонять весь файл в память. Но если быстродействие не на первом месте, и тэгов много, куда проще, использовать технологии XPath, LINQ.

Следовательно, преобразование нужно для упрощенного поиска и выборки данных из HTML-страницы.

ИНСТРУМЕНТЫ

Для преобразования HTML в XML здесь рассмотрим наиболее популярные библиотеки SGMLReader и HTMLAgilityPack. Смысл работы этих библиотек в следующем. Они берут HTML-документ, преобразуют в DOM-объект, и позволяют обращаться к HTML-документу, как к XML. Многие названия методов соответствуют DOM-интерфейсам, но за данной информацией топать надо в документацию =). Следовательно, методы доступные для XML (LINQ, XPath) будут доступны и для нашего HTML-файла.

Библиотека SGMLReader

Пример работы:

// инициализируем SGMLReader
XmlDocument FromHtml(TextReader reader)
{
   Sgml.SgmlReader sgmlReader =
new Sgml.SgmlReader();
   sgmlReader.DocType = "HTML";
   sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
   sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
   sgmlReader.InputStream = reader;
// создаем документ
   XmlDocument doc = new XmlDocument();
   doc.PreserveWhitespace = true;
   doc.XmlResolver = null;
   doc.Load(sgmlReader);


   return doc;
}


Oleg Tkachenko на www.topxml.com говорит (en), что SgmlReader лучше, чем HTML Agility Pack. Это его личное мнение :). Ссылка на пост.

Библиотека HTMLAgilityPack

Пример работы:

HtmlWeb htmlWeb = new HtmlWeb();
HtmlDocument doc = htmlWeb.Load("http://www.bbc.co.uk/");

// с помощью XPath выбираем все ссылки 
HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//a[@href]");

foreach (HtmlNode link in links)
{
 Response.Write(link.Attributes["href"].Value + "");
}


Лично я использовал HTMLAgilityPack. Проект с открытым кодом, библиотека проста в использовании, есть документация и примеры. Также присутствует возможность конвертации HTML в текст, в RSS или XML (внутри есть примеры конвертации).


ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Для полноценного использования данных библиотек, изучайте XPath и LINQ, например на MSDN:

LINQ MSDN: http://msdn.microsoft.com/ru-ru/library/bb397926.aspx

XPath MSDN примеры: http://msdn.microsoft.com/ru-ru/library/ms256086(v=vs.90).aspx


ССЫЛКИ НА СКАЧИВАНИЕ

SGMLReader: https://github.com/MindTouch/SGMLReader

HTMLAgilityPack: http://htmlagilitypack.codeplex.com/releases/view/44954


ДРУГИЕ ПАРСЕРЫ

Список других парсеров (включая HTML Parser, HTML Tidy Library и др.) с краткими пояснениями на английском расположен здесь.

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

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


profile for Anatoliy Nikolaev at Stack Overflow, Q&A for professional and enthusiast programmers