Парсеры 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 => "заголовок страницы"

Преимущества

  1. Это самая популярная и широко используемая библиотека Ruby для парсинга HTML и XML.
  2. Вы найдете множество обсуждений на форумах вопросов и ответов (например, на Stack Overflow), и вы сможете легко найти блоги и учебники онлайн, чтобы помочь вам начать.
  3. Она быстрая и эффективная благодаря использованию силы собственных парсеров libxml2 и xerces.
  4. У нее частые выпуски, которые решают проблемы с ошибками и внедряют обновления и улучшения в библиотеку.
  5. У нее мощное API, которое легко справляется с плохо отформатированным HTML, чтобы уменьшить нестабильность.
  6. Она проводит поиск содержимого в HTML и XML документах с использованием селекторов XPath и CSS.
  7. У нее подробная документация, поэтому у вас не будет проблем с пониманием конкретной функциональности.

Недостатки

  1. Основное ограничение Nokogiri заключается в том, что он один по себе недостаточен для парсинга документа, содержание которого загружается на страницу с использованием Ajax.
  2. Вы также можете столкнуться с трудностями при парсинге документа, если веб-сайт требует аутентификации, такой как имя пользователя и пароль.

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 => "заголовок страницы"

Преимущества

  1. Она очень быстрая, так как большая часть функциональности, связанной с производительностью, написана на C.
  2. Для ее работы требуется только установленный Ruby - нет других зависимостей, что делает ее очень легкой.
  3. У нее мощное API, которое позволяет читать и парсить некорректно отформатированный HTML легко, как Nokogiri.
  4. Она упрощает нахождение элементов HTML с помощью селекторов XPath и CSS.
  5. У нее хорошая документация, которая поможет вам ориентироваться в библиотеке.

Недостатки

  1. Ее больше не поддерживают, и у нее нет крепкой поддержки сообщества, так что вы, вероятно, столкнетесь с проблемами при работе с этой библиотекой.

Технически 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.text

puts parsed_data
=> “Mary Active”

Плюсы

 
  1. Она быстрая и эффективная благодаря использованию собственных средств парсинга XML.
  2. Она обрабатывает как XML, так и HTML, что делает ее полезной для разнообразных задач.
  3. Она обладает простым и интуитивно понятным интерфейсом API.
  4. Ox имеет довольно хорошую производительность и хорошую поддержку для большинства стандартных функций парсинга XML.

Минусы:

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

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"

Плюсы

  1. Легко устанавливается на различные платформы, поскольку не требует системных библиотек типа libxml.
  2. API позволяет безопасно разбирать и запрашивать документы в многопоточной среде.
  3. Он занимает мало места в памяти.
  4. В комплект поставки входит хорошая документация, помогающая изучить и использовать библиотеку.

Недостатки

  1. У нее очень мало последних релизов, и она не очень активно поддерживается, поэтому редко получает обновления и улучшения.

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.content

puts parsed_data
=> "Mary Active"

Плюсы

  1. Очень быстрая, так как написана на языке C.
  2. Активно поддерживается обновлениями и улучшениями, часто выпускается.
  3. Имеет хорошую документацию.
  4. Осуществляет автоматическое управление памятью.

Минусы

  1. Для нормальной работы полагается на libxml2, которая, в свою очередь, полагается на libm, libz и libiconv.
  2. Это не лучший выбор для разбора 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
=> "Веб-форма"

Плюсы

  1. Это один из самых популярных и широко используемых инструментов обеспечения качества, поэтому он имеет очень активную поддержку сообщества.
  2. Он поддерживается многочисленными учебными пособиями, записями в блогах, видеороликами и книгами, поэтому у вас не будет недостатка в ресурсах для изучения и использования этого инструмента.
  3. Он содержит очень хорошую документацию с примерами.
  4. Он активно поддерживается и обновляется.
  5. Поддерживаются восемь традиционных стратегий поиска веб-элементов: имя класса, CSS-селектор, id, имя, текст ссылки, текст частичной ссылки, имя тега и XPath.

Минусы

  1. Поскольку Selenium WebDriver является универсальной библиотекой автоматизации браузеров и используется в основном для обеспечения качества, использование Selenium WebDriver для разбора HTML может оказаться излишним.
  2. Для реализации ее функций необходимо установить драйверы браузера.
  3. Это самая медленная библиотека в данном списке, поскольку ей необходимо взаимодействовать с браузером через драйвер браузера.
  4. Selenium WebDriver не поддерживает механизм автоматического ожидания, что может привести к нестабильной работе скриптов.

Заключение

Веб-парсинг очень полезен для автоматизированного извлечения нужных структурированных данных из HTML- и XML-документов, особенно если у вас нет доступа к публичному API, предоставляющему эти данные, например, при создании системы управления контентом. Сообщество разработчиков Ruby предоставляет несколько библиотек, облегчающих разбор этих HTML- и XML-документов. В этой статье мы рассмотрим шесть из них, чтобы дать вам возможность выбрать подходящий парсер для конкретного случая использования.

Каждая библиотека парсинга обладает уникальным набором функций, которые, в зависимости от ваших приоритетов, могут оказаться полезными. Если вы ищете полноценный парсер HTML и XML, обратите внимание на Nokogiri. Это один из самых популярных вариантов, и в нем есть множество ресурсов, которые помогут вам в случае затруднений. Если вы не хотите использовать Nokogiri для разбора HTML, то можно рассмотреть Hpricot, который обеспечивает аналогичный уровень точности. Если для вас главным приоритетом является скорость, попробуйте Ox. С другой стороны, LibXML Ruby или Oga могут стать отличным выбором, если вы ищете библиотеку с небольшим объемом памяти. И, наконец, если вам необходимо имитировать действия браузера при разборе документа, то лучшим выбором будет Selenium WebDriver.