Парсинг HTML-страниц на примере Yandex.Маркет (с HtmlAgilityPack)

      Довольно часто возникает ситуация, когда в автоматическом режиме необходимо получить какие-либо данные со страницы в формате HTML или XHTML. Выполнить синтаксический анализ можно разными способами, как используя встроенные в Framework средства, так и сторонние библиотеки. В данной инструкции будет рассмотрен процесс синтаксического анализа с использованием языка XPath (XML Path Language), реализующим доступ к частям документа XML, в файлах трансформации XSLT и являющимся стандартом консорциума W3C. В качестве источника данных для синтаксического анализа будет использоваться раздел характеристик устройства, выбранного в Yandex.Маркет.
       Предположим, что необходимо получить характеристики товара со страницы http://market.yandex.ru/model-spec.xml?modelid=10436573&hid=6427100.
      Первая часть работы — получение html-текста страницы. Как вы его получите, — это уже второй вопрос или через WebClient, компонент браузера или загрузите файл с жесткого диска.
      Вторая часть работы сводится собственно к синтаксическому анализу нужного текста. Для начала нам необходимо получить XPath к заданном элементу в структуре HTML или XHTML. Чтобы не писать все руками, открываем браузер Chrome или Firefox с плагином Firebug. В браузере F12 и попадаем в исходный код страницы. Выбираем искомый элемент и нажимаем правую кнопку мыши. В выпадающем меню выбираем Copy XPath. В Firefox по аналогии.

В результате в буфере обмена будет текст (для Chrome):
/html/body/div[2]/div[2]/h1
      В этом тексте описан полный путь к элементу. Но, здесь есть нужно кое-что изменить. Во первых всегда нужно убирать tbody, во вторых нет необходимости писать html или *[@id="js"], в случае с Chrome.
Достаточно строки:

body/div[2]/div[2]/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[2]/div[2]/h1");    
    return node.OuterHtml;
}
      В данном случае мы передаем тело html-страницы и через SelectSingleNode получаем исходный код таблицы. Обратите внимание, чтобы получить html-код найденной таблицы, необходимо использовать свойство OuterHtml. Свойство InnerHtml вернет чистый текст без тегов. Таким образом, мы на выходе метода получим таблицу, которую можно разобрать и обработать.
      Все остальные данные по товару получаем по схожей схеме. Ниже представлен пример работы тестового проекта по получению технических характеристик устройства с Yandex.Маркет.

Ссылка для скачивания примера: Rusfolder.net


yandex

3 комментария:

  1. код не работает!
    Ссылка на объект не указывает на экземпляр объекта.

    ОтветитьУдалить
  2. Здравствуйте, пожалуйста,
    отправьте ваш проект через форму обратной связи или прикрепив его в новом
    комментарии, что бы наши специалисты могли его протестировать.

    ОтветитьУдалить
  3. Здравствуйте. Ваш код не работает. Не обработанное исключение. Почему ?

    ОтветитьУдалить

Большая просьба, не писать в комментариях всякую ерунду не по теме!