4 октября 2012 г.

Парсинг ресурсов с Nokogiri в приложении Ruby on rails

Долгое время не доходили руки написать эту статью, однако слабая освещенность темы в рунете заставила меня вернуться к ней.

Итак, в этой статье я расскажу как легко и быстро парсить информацию с онлайн ресурсов для последующей работы с ней в ваших RubyOnRails приложениях. В этом нам поможет замечательный гем Nokogiri - это HTML, XML, SAX , и RSS парсер. Среди прочих фишек Nokogiri имеется возможность доступа к элементам по XPath и CSS3-селекторам. Это означает что вы можете использовать Nokogiri не только для парсинга веб-ресурсов, но и для разбора xml-файлов самых разных видов.



Начнём с добавления гема в ваш конфигурационный файл:

Обновим bundle:

Теперь мы можем подключить Nokogiri в контроллер в своём приложении. Создадим контроллер parser:

Пропишем в /app/controllers/parser_controller.rb следующие строки:

Теперь мы можем использовать объект Nokogiri для получения информации с удалённых источников. Так происходит получение контента веб-страницы:

Также доступны следующие интерфейсы Nokogiri::HTML::SAX, Nokogiri::XML, Nokogiri::XML::SAX, Nokogiri::CSS и др. Подробнее о методах и свойствах интерфейсов в Nokogiri вы можете прочитать в официальной документации (см. ссылку в конце статьи).

В примере выше мы получили в объект page содержимое страницы http://catalog.yandex.ru/. Это главная страница Яндекс.Каталога (disclaimer). Попробуем получить все ссылки, ведущие на разделы верхнего уровня каталога, представленные на этой странице. Если изучить html-разметку страницы, то становится понятно, что такие ссылки обладают атрибутом класса "b-rubric__list__item__link", его мы и используем:

В данном примере мы получили доступ к атрибутам и содержимому DOM-узлов по их css-селектору, аналогично тому как мы привыкли делать это в яваскрипт, но в сценарии Ruby на сервере. Стоит отметить, что список поддерживаемых конструкций селекторов достаточно полон, вы можете использовать конструкции вложения (#parent > .child), абстрактного определения (body * - все элементы внутри тега body) и псевдоселеторы (:first-child и т.п.).

Библиотека Nokogiri в ходе первичного ознакомления показала себя очень мощным, гибким, быстрым, а главное - простым и интуитивно понятным инструментом.

Официальная страница проекта на момент написания статьи: http://nokogiri.org/ — здесь вы найдете массу исчерпывающих примеров, хотя страницы документации пока содержат довольно мало информации.

Приветствуются комментарии и замечания, а также предложения по тематике будущих статей.

Disclaimer — информация в статье является информационно-ознакомительной и не призывает к неправомерной краже чужой интеллектуальной собственности.

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

  1. А как сделать так, чтобы сайт отображался во вьюшке?

    ОтветитьУдалить
    Ответы
    1. Анатолий, вопрос отображения чужого контента сильно завязан на каждом конкретном случае (например нужно обеспечивать "базу" внешних для чужой разметки элементов - стилей, картинок, скриптов и пр.) - в данный момент я не осведомлен о библиотеках решающих эту проблему. Написание своего кода является трудоемкой задачей, решение которой придется доводить и тестировать до стабильной работы большим количеством тестов.

      Удалить