Довольно часто возникает ситуация, когда в автоматическом режиме необходимо получить какие-либо данные со страницы в формате HTML или XHTML. Выполнить синтаксический анализ можно разными способами, как используя встроенные в Framework средства, так и сторонние библиотеки. В данной инструкции будет рассмотрен процесс синтаксического анализа с использованием языка XPath (XML Path Language), реализующим доступ к частям документа XML, в файлах трансформации XSLT и являющимся стандартом консорциума W3C. В качестве источника данных для синтаксического анализа будет использоваться раздел характеристик устройства, выбранного в Yandex.Маркет.
Предположим, что необходимо получить характеристики товара со страницы http://market.yandex.ru/model-spec.xml?modelid=10436573&hid=647100.
Первая часть работы Q получение html-текста страницы. Как вы его получите, Q это уже второй вопрос или через WebClient, компонент браузера или загрузите файл с жесткого диска.
Вторая часть работы сводится собственно к синтаксическому анализу нужного текста. Для начала нам необходимо получить XPath к заданном элементу в структуре HTML или XHTML. Чтобы не писать все руками, открываем браузер Chrome или Firefox с плагином Firebug. В браузере F1 и попадаем в исходный код страницы. Выбираем искомый элемент и нажимаем правую кнопку мыши. В выпадающем меню выбираем Copy XPath. В Firefox по аналогии.
В результате в буфере обмена будет текст (для Chrome):
/html/body/div[]/div[]/h1
В этом тексте описан полный путь к элементу. Но, здесь есть нужно кое-что изменить. Во первых всегда нужно убирать tbody, во вторых нет необходимости писать html или *[@id=»js»], в случае с Chrome.
Достаточно строки:
body/div[]/div[]/h1
Теперь берем библиотеку HtmlAgilityPack и скармливаем ей наш путь и исходный текст страницы следующим образом:
public string GetDescription(string html)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.OptionFixNestedTags = true;
doc.Load(new StringReader(html));
HtmlNode node = doc.DocumentNode.SelectSingleNode("//body/div[]/div[]/h1");
return node.OuterHtml;
}
В данном случае мы передаем тело html-страницы и через SelectSingleNode получаем исходный код таблицы. Обратите внимание, чтобы получить html-код найденной таблицы, необходимо использовать свойство OuterHtml. Свойство InnerHtml вернет чистый текст без тегов. Таким образом, мы на выходе метода получим таблицу, которую можно разобрать и обработать.
Все остальные данные по товару получаем по схожей схеме. Ниже представлен пример работы тестового проекта по получению технических характеристик устройства с Yandex.Маркет.
Ссылка для скачивания примера: Rusfolder.net













