Я большой поклонник Нокигири, но зачем изобретать колесо?
URI модуль Руби уже имеет extract
способ сделать это:
URI::extract(str[, schemes][,&blk])
Из документов:
Экстракты Юрис из строки. Если данный блок задан, выполняется итерация через все согласованные URI. Возвращает nil, если задан блок или массив со спичками.
require "uri"
URI.extract("text here http://foo.example.org/bla and here mailto:[email protected] and here also.")
# => ["http://foo.example.com/bla", "mailto:[email protected]"]
Вы можете использовать Nokogiri ходить DOM и тянуть все теги, которые имеют URL-адреса, или это получить только текст и передать его в URI.extract
, или просто позволить URI.extract
делать все это.
И зачем использовать синтаксический анализатор, такой как Nokogiri, вместо шаблонов регулярных выражений?Поскольку HTML и XML можно форматировать по-разному и по-прежнему правильно отображать на странице или эффективно передавать данные. Браузеры очень прощают, когда дело доходит до принятия плохой разметки. С другой стороны, шаблоны регулярных выражений работают в очень ограниченном диапазоне «приемлемости», где этот диапазон определяется тем, насколько хорошо вы ожидаете изменений в разметке или, наоборот, насколько хорошо вы ожидаете, что ваш шаблон может пойти не так, когда представлены неожиданными шаблонами.
Парсер не работает как регулярное выражение. Он создает внутреннее представление документа, а затем просматривает его. Неважно, как выкладывается файл/разметка, он выполняет свою работу по внутреннему представлению DOM. Nokogiri релаксирует свой синтаксический анализ для обработки HTML, потому что HTML известен тем, что плохо написан. Это помогает нам, потому что с большинством неадаптируемых HTML Nokogiri может это исправить. Иногда я сталкиваюсь с чем-то, что так плохо написано, что Nokogiri не может исправить это правильно, поэтому мне придется немного подтолкнуть его, изменив HTML, прежде чем передать его Nokogiri; Я все равно использую синтаксический анализатор, а не пытаюсь использовать шаблоны.
Пожалуйста, не пытайтесь анализировать HTML с регулярными выражениями, парсер HTML будет служить вам лучше. –
@mu вы можете объяснить мне почему? –
Поскольку разбор HTML более сложный, чем вы, вероятно, думаете, и есть много разбитого HTML, что простые регулярные выражения не будут обрабатываться: http://stackoverflow.com/questions/4231382/regular-expression-pattern- not-matching-where-in-string/4234491 # 4234491 –