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 и др.) с краткими пояснениями на английском расположен здесь.
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 и др.) с краткими пояснениями на английском расположен здесь.
Комментариев нет:
Отправить комментарий