CoderCastrov logo
CoderCastrov
Парсер

Как я использовал Ruby, чтобы сделать Nokogiri более точным инструментом для парсинга

Как я использовал Ruby, чтобы сделать Nokogiri более точным инструментом для парсинга
просмотров
5 мин чтение
#Парсер
  • В этом посте я расскажу о уроке, который я усвоил, работая над своим первым проектом CLI, и о том, как я смог преодолеть препятствие, просто используя несколько базовых инструментов, уже доступных мне.

Значимость

Работая над своим первым проектом для Flatiron (создание приложения CLI с использованием внешних данных), я получил возможность применить все, что я узнал о парсинге в Ruby, с нуля. Когда я начал писать класс для своего парсера, я понял, что больше нет пошагового руководства для моего конкретного проекта, и мне пришлось быть находчивым.

Получив возможность написать полноценный CLI-инструмент с нуля до конца, я смог глубже понять, как информация передается в приложении. Это стало особенно явным, когда я создавал парсер для извлечения определенных данных с веб-сайта о чаях. Я узнал, какие действия можно предпринять, чтобы дополнительно выделить конкретную информацию из неспецифических данных, полученных при парсинге.

Целью является не только рассказать историю, но и дать читателю другую перспективу на поиск решения подобных ситуаций и вдохновить его действовать. Возможно, вам придется столкнуться с задачей извлечения конкретной информации из веб-сайта и дальнейшей обработки ее в нужный формат, однако, используя различные простые тактики, представленные в этом посте, вы сможете восстановить свою уверенность в парсинге веб-данных.

Возможность переключаться на другой инструмент, когда один не может выполнить задачу, тренирует ум использовать разные инструменты в совокупности. Большинство задач разработки можно решить, если вы не заключаете себя в рамки. Вы можете получить новое понимание парсинга, используя инструменты, доступные вам по умолчанию в Ruby, и, возможно, сэкономить время на поиске решения.

Парсинг Контекста

Когда я изучал парсинг, мне была представлена новая библиотека - 'Nokogiri'. Nokogiri (в сочетании с 'open-uri') - это мощный инструмент, который позволяет Ruby-разработчикам парсить/получать информацию с практически любого HTML-сайта так точно, как им нужно, по крайней мере, до определенной степени. Здесь я расскажу о том, какие события привели меня к этой точке и как я смог найти решение для более точного указания нужных данных.

Для немного контекста, данные, которые я парсил/получал, взяты с веб-сайта 'Traditional Medicinals®'. В содержимое входят различные настроения/эффекты, чаи, которые обеспечивают эти эффекты, и описание каждого чая (основной фокус этого поста).

Процесс

Изучение информации

Сначала я изучаю страницу с информацией, которую я хочу спарсить.

Здесь я нашел HTML-элемент, содержащий нужную мне информацию (описание чая/историю растения).

Использование Nokogiri и Open-URI для получения информации

Теперь, когда я нашел нужную информацию, я могу создать метод "scrape_tea_desc" в классе "Scraper", который принимает чай, описание которого мы хотим получить.

*Имейте в виду, что к моменту вызова этого метода уже были созданы некоторые объекты чая, чтобы их можно было передать в качестве аргумента.

Я сохраняю атрибут URL чая в переменную с именем "link".

Затем я использую Nokogiri::HTML, который принимает HTML-код, чтобы создать объект, похожий на массив, содержащий весь HTML-код веб-страницы, чтобы мы могли в дальнейшем перебирать его и выбирать определенные элементы. Чтобы получить этот код, я использовал метод "open" из Open-URI, который позволяет нам передать нашу переменную "link", чтобы он мог получить HTML-код веб-сайта. Теперь я могу сохранить HTML чая из Nokogiri в переменную с именем "doc".

Наконец, я использовал метод выбора CSS на структуре, похожей на HTML, в "doc", используя #css. Я передаю в него селекторы с веб-страницы нашего чая, которые указывают, что мы ищем: описание.

Селекторы - 'div.trm-product-details' и третий <p> 'p:nth-child(3)'. Затем мы можем преобразовать все это в текст, используя #text, и сохранить его в переменную (tea_info):

Ой, когда я обращаюсь к "tea_info", я получаю: "Plant Story\nCelebrated in herbal..." Здесь начинается моя настоящая проблема с парсингом. Мне не нужно "Plant Story\n" в нем, мне нужно только описание! Я не могу использовать более конкретный селектор CSS, потому что и "Plant Story", и описание находятся под одним и тем же тегом (<p>), и у описания нет своего собственного тега, класса или идентификатора!

Помощь Ruby и Pry

Я искал ответы везде, но поиск в Google "исключить элемент из метода css Nokogiri" не привел ни к чему, кроме путаницы. Было несколько ответов, которые использовали регулярные выражения, но я раньше не использовал регулярные выражения и не хотел включать что-то в свой проект, что я еще не понимаю.

К счастью, Ruby - мощный язык, и есть много более простых методов, которые я смог использовать для работы с "tea_info" и получения только описания.

Сначала мне нужно отделить "Plant Story" от описания. Какой метод может разделить строки? #split. Где я могу разделить его? Между заголовком и описанием идеально расположен символ '\n'. Теперь у меня остается что-то вроде этого: ["Plant Story", "Celebrated in herbal..."]

Поскольку Ruby настолько мощный, у меня теперь есть 2+ разных способа получить только описание!

  • description = tea_info[1]

или

  • Удалить первый элемент с помощью #shift и преобразовать массив в строку с помощью #join

Вот и все! Вот как выглядит мой конечный продукт, когда я выбираю чай в своем приложении:

Успех

Предоставьте краткое изложение того, что только что узнал читатель и почему это важно. Вы также можете включить идеи о том, как продвинуть эту информацию дальше, например, создав новые проекты или исследуя дополнительные связанные темы. Если хотите, можете рассказать о своих чувствах, изучая эту тему.

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

Парсинг чего-либо конкретного не всегда будет требовать длительного процесса, но как только вы найдете время исследовать комбинирование различных инструментов для выполнения задачи и поймете, что всегда есть решение, вся поездка превратится в танец, а не в поход.

Больше о проекте Tea Moods CLI

Исследуйте репозиторий GitHub здесь:

Посмотрите демонстрацию для инструкций по использованию приложения: