Использование первой библиотеки

Давайте попробуем установить новую библиотеку с помощью bundler и заодно научимся ее использовать.

Добавьте в ваш Gemfile новый гем с помощью:

# В данном случае мы завязываемся на конкретную версию библиотеки
gem 'nokogiri', '~> 1.14', '== 1.14.2'

Теперь установим нашу библиотеку с помощью команды bundle install

Отлично ! Теперь научимся ее использовать. Укажем в начале нашего .rb файле зависимость от нашей библиотеки с помощью require "nokogiri"

Nokogiri

Nokogiri - библиотека для парсинга HTML и XML. Благодаря ней мы можем вытаскивать нужные нам куски HTML используя CSS селекторы. Чаще всего такой вид работы можно встретить на сайтах агрегаторах авиабилетов или купли/продажи. Вместо того, чтобы создавать свою базу и заполнять ее информацией порой проще взять чужой сайт, вытащить оттуда необходимое и отдать нашему пользователю.

Для того, чтобы nokogiri распарсил нам HTML, необходимо вызвать Nokogiri::HTML и передать ему HTML в текстовом формате. Для того, чтобы получить HTML какого-либо сайта в текстовом формате можно воспользоваться библиотекой из стандартной поставки open-uri, которая вляется надстройкой над Net::HTTP клиентом для упрощения получения контента

# из этой библиотеки мы получаем класс URI
require "open-uri"
# Отсюда мы получаем Nokogiri::HTML
require "nokogiri"

# Сначала с помощью URI.open получаем содержимое HTML сайта интерфакс
# Далее передаем это в Nokogiri::HTML 
doc = Nokogiri::HTML(URI.open("https://www.interfax.ru/"))

В переменной doc хранится объект документа nokogiri, который может быть частью модуля HTML5 или HTML4 или XML, в зависимости от формата, который был ему передан.

Теперь попробуем вытащить с главной страницы список главных новостей. Для начала окроем DevTools в браузере и построим CSS селектор, который будет забирать нужную нам информацию, в данном случае это будет main .mainblock .leftside .newsmain a h3. Рассмотрим как мы его построили:

  • берем тег <main>

  • внутри него берем бег с классом "mainblock"

  • внутри него берем тег с классом "leftside"

  • у него внутри есть тег с классом "newsmain"

  • оттуда достаем ссылки <a>

  • и из этих ссылок достаем заголовки <h3>

Как видим в получение нужной информации нет ничего сложного

Теперь вытаскиваем из нашего nokogiri документа эту информацию с помощью получившегося селектора:

news = doc.css("main .mainblock .leftside .newsmain a h3")

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

# не забываем про фишки синтаксического сахара
news = doc.css("main .mainblock .leftside .newsmain a h3").map(&:content)

Вот так всего за пару строчек кода мы смогли вытащить из сайта ту информацию, которая нам необходима. Помимо метода .text у элемента есть еще и такой метод как [] (вспоминаем про синтаксический сахар), который позволяем нам получать значение из атрибута. Например, чтобы получить значение класса элемента нам нужно вызвать метод в таком виде element[:class].

Задание html_parsing

Создайте класс Interview с такими атрибутами как interviewee, title и description:

class Interview
  def initialize(interviewee, description, title)
    @interviewee = interviewee
    @description = description
    @title = title
  end
end

Внизу главной страницы интерфакса вы найдете блок "интервью". необходимо его распарсить и преобразовать данные оттуда в объекты класса Interview. Полученные массив объектов записать в файл формата JSON с названием interviews.json.

Дополнительный материал

Last updated