> For the complete documentation index, see [llms.txt](https://evgenii-afanasev.gitbook.io/ruby-course/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://evgenii-afanasev.gitbook.io/ruby-course/8_libraries/2_first_library.md).

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

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

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

```ruby
# В данном случае мы завязываемся на конкретную версию библиотеки
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` клиентом для упрощения получения контента

```ruby
# из этой библиотеки мы получаем класс 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 документа эту информацию с помощью получившегося селектора:

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

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

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

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

## Задание html\_parsing

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

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

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

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

* [Официальная документация по Nokogiri](https://nokogiri.org)
* [Еще немного про Nokogiri на Habr](https://habr.com/ru/articles/252379/)
