Парсеры HTML и XML на языке Ruby
Сообщество разработчиков Ruby предлагает некоторые отличные библиотеки парсинга HTML и XML, которые могут удовлетворить все ваши потребности в сборе данных с веб-сайтов для разработки веб-приложений - здесь есть множество вариантов. При выборе, с каким пойти, вы можете рассмотреть следующие критерии:
- Он должен быть с открытым исходным кодом.
- Должна быть хорошая поддержка сообщества.
- Он должен обеспечивать хорошую производительность.
- Он должен активно поддерживаться. Должен быть легким.
- Должна быть хорошая документация.
Чтобы помочь вам выбрать подходящий парсер для вашего проекта, этот статья проанализирует шесть библиотек парсинга HTML и XML в Ruby на основе вышеуказанных критериев.
Nokogiri
Nokogiri - это библиотека парсинга HTML и XML с открытым исходным кодом для Ruby. Внутри она использует парсеры, такие как libxml2 и xerces, для выполнения своих основных функций. Помимо предоставления API, соответствующего строгой политике безопасности, она также предлагает функции, такие как DOM-парсер, SAX-парсер, Push-парсер и преобразование XSLT.
Nokogiri является стандартным HTML-парсером для Mechanize, библиотеки для автоматизации веб-браузеров.
Вот пример использования Nokogiri:
require 'nokogiri'
doc = "<html><head><title>заголовок страницы<\/title><\/head><body>содержание страницы<\/body><\/html>" parsed_data = Nokogiri::HTML.parse(doc)
puts parsed_data.title => "заголовок страницы"
Преимущества
- Это самая популярная и широко используемая библиотека Ruby для парсинга HTML и XML.
- Вы найдете множество обсуждений на форумах вопросов и ответов (например, на Stack Overflow), и вы сможете легко найти блоги и учебники онлайн, чтобы помочь вам начать.
- Она быстрая и эффективная благодаря использованию силы собственных парсеров libxml2 и xerces.
- У нее частые выпуски, которые решают проблемы с ошибками и внедряют обновления и улучшения в библиотеку.
- У нее мощное API, которое легко справляется с плохо отформатированным HTML, чтобы уменьшить нестабильность.
- Она проводит поиск содержимого в HTML и XML документах с использованием селекторов XPath и CSS.
- У нее подробная документация, поэтому у вас не будет проблем с пониманием конкретной функциональности.
Недостатки
- Основное ограничение Nokogiri заключается в том, что он один по себе недостаточен для парсинга документа, содержание которого загружается на страницу с использованием Ajax.
- Вы также можете столкнуться с трудностями при парсинге документа, если веб-сайт требует аутентификации, такой как имя пользователя и пароль.

Hpricot
Hpricot - еще одна библиотека парсинга HTML с открытым исходным кодом для Ruby. Изначально она была разработана для парсинга HTML-документов, хотя технически способна парсить также XML-документы. Она точно находит элементы в HTML-документах, поэтому если вы видите какое-то содержание в HTML-документе в браузере, Hpricot обязательно его распарсит.
Вот пример использования Hpricot:
require 'hpricot'
doc = "<html><head><title>заголовок страницы<\/title><\/head><body>содержание страницы<\/body><\/html>" parsed_data = Hpricot(doc).at("title").inner_html
puts parsed_data => "заголовок страницы"
Преимущества
- Она очень быстрая, так как большая часть функциональности, связанной с производительностью, написана на C.
- Для ее работы требуется только установленный Ruby - нет других зависимостей, что делает ее очень легкой.
- У нее мощное API, которое позволяет читать и парсить некорректно отформатированный HTML легко, как Nokogiri.
- Она упрощает нахождение элементов HTML с помощью селекторов XPath и CSS.
- У нее хорошая документация, которая поможет вам ориентироваться в библиотеке.
Недостатки
- Ее больше не поддерживают, и у нее нет крепкой поддержки сообщества, так что вы, вероятно, столкнетесь с проблемами при работе с этой библиотекой.
Технически Hpricot не предназначен для парсинга XML. Он не валидирует XML-документы, поэтому вы можете столкнуться с проблемами при работе с некорректным XML.
Ox
Оптимизированный XML (Ox), как подразумевает его название, это быстрая и эффективная библиотека парсинга XML для Ruby с возможностями обработки HTML. Она является открытым исходным кодом и предоставляет чистый и простой API. Ox обрабатывает XML-документы тремя способами: как общий XML-парсер и писатель, как быстрый маршаллер объектов/XML и как потоковый SAX-парсер. Он нацелен на замену Nokogiri и другим Ruby XML-парсерам для парсинга XML и Marshal для сериализации объектов.
Вот пример использования Ox:
require 'ox'
parsed_doc = Ox.parse(%{
<?xml?>
<Person>
<Name>Mary Active<\/Name>
<Age>21<\/Age>
<\/Person>
})
parsed_data = parsed_doc.Person.Name.textputs parsed_data
=> “Mary Active”
Плюсы
- Она быстрая и эффективная благодаря использованию собственных средств парсинга XML.
- Она обрабатывает как XML, так и HTML, что делает ее полезной для разнообразных задач.
- Она обладает простым и интуитивно понятным интерфейсом API.
- Ox имеет довольно хорошую производительность и хорошую поддержку для большинства стандартных функций парсинга XML.
Минусы:
- Возможно, она не так широко распространена и популярна, как Nokogiri, и, возможно, вам придется искать меньше ресурсов для поддержки и обучения.
- Она может не подходить для сложных сценариев парсинга, которые требуют множества дополнительных функций и расширений.
Oga
Oga - еще один парсер HTML и XML с открытым исходным кодом, написанный на языке Ruby. Он использует небольшое собственное расширение (C для MRI/Rubinius; Java для JRuby) для достижения большей производительности. Он предоставляет простой API для разбора, модификации и запроса документов с помощью XPath, а также поддерживает пространства имен XML (регистрация, запрос и т.д.).
Приведем пример использования Oga:
require 'oga'
parsed_doc = Oga.parse_xml(%{
<?xml?
<Person>
<Имя>Мария Актив<\/Имя>
<Возраст>21<\/Возраст>
<\/Person>
})
parsed_data = parsed_doc.at_xpath('Person/Name/text()')puts parsed_data
=> "Mary Active"
Плюсы
- Легко устанавливается на различные платформы, поскольку не требует системных библиотек типа libxml.
- API позволяет безопасно разбирать и запрашивать документы в многопоточной среде.
- Он занимает мало места в памяти.
- В комплект поставки входит хорошая документация, помогающая изучить и использовать библиотеку.
Недостатки
- У нее очень мало последних релизов, и она не очень активно поддерживается, поэтому редко получает обновления и улучшения.

LibXML Ruby
LibXML Ruby представляет собой обертку на языке Ruby для XML-библиотеки GNOME libxml2. Она имеет открытый исходный код и предоставляет невероятное количество возможностей, таких как проверка XML, поддержка XPath, поддержка XSLT и т.д.
Приведем пример использования LibXML Ruby:
require 'xml'
parsed_doc = XML::Parser.string(%{
<Person>
<Имя>Мария Актив<\/Имя>
<Возраст>21<\/Возраст>
<\/Person>
})
parsed_data = parsed_doc.parse.find('//Name').first.contentputs parsed_data
=> "Mary Active"
Плюсы
- Очень быстрая, так как написана на языке C.
- Активно поддерживается обновлениями и улучшениями, часто выпускается.
- Имеет хорошую документацию.
- Осуществляет автоматическое управление памятью.
Минусы
- Для нормальной работы полагается на libxml2, которая, в свою очередь, полагается на libm, libz и libiconv.
- Это не лучший выбор для разбора HTML, поскольку он поддерживает разбор документов HTML4, в то время как большинство современных браузеров используют HTML5, который ведет себя по-другому.
Selenium WebDriver
Selenium WebDriver - это инструмент автоматизации браузеров с открытым исходным кодом, предлагающий привязку к языку Ruby. Это гораздо больше, чем библиотека для разбора HTML, - это поддержка нескольких браузеров, работа с динамическими веб-элементами, широкий спектр стратегий определения местоположения, событий мыши и клавиатуры и многое другое. Это делает его популярным среди инженеров по контролю качества для проведения валидации тестов при тестировании веб-приложений.
Приведем пример использования Selenium WebDriver:
require 'selenium-webdriver'
require 'webdrivers/chromedriver'driver = Selenium::WebDriver.for :chrome
driver.get('https://www.selenium.dev/selenium/web/web-form.html')puts driver.title
=> "Веб-форма"
Плюсы
- Это один из самых популярных и широко используемых инструментов обеспечения качества, поэтому он имеет очень активную поддержку сообщества.
- Он поддерживается многочисленными учебными пособиями, записями в блогах, видеороликами и книгами, поэтому у вас не будет недостатка в ресурсах для изучения и использования этого инструмента.
- Он содержит очень хорошую документацию с примерами.
- Он активно поддерживается и обновляется.
- Поддерживаются восемь традиционных стратегий поиска веб-элементов: имя класса, CSS-селектор, id, имя, текст ссылки, текст частичной ссылки, имя тега и XPath.
Минусы
- Поскольку Selenium WebDriver является универсальной библиотекой автоматизации браузеров и используется в основном для обеспечения качества, использование Selenium WebDriver для разбора HTML может оказаться излишним.
- Для реализации ее функций необходимо установить драйверы браузера.
- Это самая медленная библиотека в данном списке, поскольку ей необходимо взаимодействовать с браузером через драйвер браузера.
- Selenium WebDriver не поддерживает механизм автоматического ожидания, что может привести к нестабильной работе скриптов.
Заключение
Веб-парсинг очень полезен для автоматизированного извлечения нужных структурированных данных из HTML- и XML-документов, особенно если у вас нет доступа к публичному API, предоставляющему эти данные, например, при создании системы управления контентом. Сообщество разработчиков Ruby предоставляет несколько библиотек, облегчающих разбор этих HTML- и XML-документов. В этой статье мы рассмотрим шесть из них, чтобы дать вам возможность выбрать подходящий парсер для конкретного случая использования.
Каждая библиотека парсинга обладает уникальным набором функций, которые, в зависимости от ваших приоритетов, могут оказаться полезными. Если вы ищете полноценный парсер HTML и XML, обратите внимание на Nokogiri. Это один из самых популярных вариантов, и в нем есть множество ресурсов, которые помогут вам в случае затруднений. Если вы не хотите использовать Nokogiri для разбора HTML, то можно рассмотреть Hpricot, который обеспечивает аналогичный уровень точности. Если для вас главным приоритетом является скорость, попробуйте Ox. С другой стороны, LibXML Ruby или Oga могут стать отличным выбором, если вы ищете библиотеку с небольшим объемом памяти. И, наконец, если вам необходимо имитировать действия браузера при разборе документа, то лучшим выбором будет Selenium WebDriver.


