Я большой поклонник Нокогири, но зачем изобретать велосипед?
Модуль Ruby's URI уже имеет метод extract
для этого:
URI::extract(str[, schemes][,&blk])
Из документов:
Извлекает URI из строки. Если указан блок, выполняется итерация по всем совпадающим URI. Возвращает nil, если данный блок или массив с совпадениями.
require "uri"
URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
# => ["http://foo.example.com/bla", "mailto:test@example.com"]
Вы можете использовать Nokogiri для обхода DOM и извлекать все теги, которые имеют URL-адреса, или получать из него только текст и передавать его в URI.extract
, или просто позволить URI.extract
сделать все это.
И зачем использовать синтаксический анализатор, такой как Nokogiri, вместо шаблонов регулярных выражений? Потому что HTML и XML могут быть отформатированы множеством разных способов и при этом по-прежнему правильно отображаться на странице или эффективно передавать данные. Браузеры очень снисходительны, когда принимают плохую разметку. Шаблоны регулярных выражений, с другой стороны, работают в очень ограниченных диапазонах «приемлемости», где этот диапазон определяется тем, насколько хорошо вы предвидите изменения в разметке, или, наоборот, насколько хорошо вы предвидите, как ваш шаблон может пойти не так, когда представлены с неожиданными узорами.
Парсер не работает как регулярное выражение. Он создает внутреннее представление документа, а затем проходит через это. Неважно, как устроен файл / разметка, он работает над внутренним представлением DOM. Nokogiri облегчает свой анализ для обработки HTML, потому что HTML печально известен своей плохой написанностью. Это помогает нам, потому что с большинством неподтвержденных HTML Nokogiri может исправить это. Иногда я сталкиваюсь с чем-то настолько написанным, что Nokogiri не может исправить это правильно, поэтому мне придется слегка подтолкнуть его, настроив HTML-код, прежде чем передать его Nokogiri; Я все еще буду использовать парсер, а не пытаться использовать шаблоны.