Долгое время не доходили руки написать эту статью, однако слабая освещенность темы в рунете заставила меня вернуться к ней.
Итак, в этой статье я расскажу как легко и быстро парсить информацию с онлайн ресурсов для последующей работы с ней в ваших 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 — информация в статье является информационно-ознакомительной и не призывает к неправомерной краже чужой интеллектуальной собственности.
Итак, в этой статье я расскажу как легко и быстро парсить информацию с онлайн ресурсов для последующей работы с ней в ваших 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 — информация в статье является информационно-ознакомительной и не призывает к неправомерной краже чужой интеллектуальной собственности.
А как сделать так, чтобы сайт отображался во вьюшке?
ОтветитьУдалитьАнатолий, вопрос отображения чужого контента сильно завязан на каждом конкретном случае (например нужно обеспечивать "базу" внешних для чужой разметки элементов - стилей, картинок, скриптов и пр.) - в данный момент я не осведомлен о библиотеках решающих эту проблему. Написание своего кода является трудоемкой задачей, решение которой придется доводить и тестировать до стабильной работы большим количеством тестов.
Удалить