Как извлечь URL из текста - PullRequest
       1

Как извлечь URL из текста

18 голосов
/ 08 сентября 2010

Как мне извлечь все URL из простого текстового файла в Ruby?

Я пробовал некоторые библиотеки, но в некоторых случаях они терпели неудачу.Какой лучший способ?

Ответы [ 6 ]

91 голосов
/ 15 марта 2012

Если вам нравится использовать то, что вам уже предоставлено в Ruby:

require "uri"
URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
# => ["http://foo.example.org/bla", "mailto:test@example.com"]

Подробнее: http://railsapi.com/doc/ruby-v1.8/classes/URI.html#M004495

11 голосов
/ 04 ноября 2013

Я использовал twitter-text gem

require "twitter-text"
class UrlParser
    include Twitter::Extractor
end

urls = UrlParser.new.extract_urls("http://stackoverflow.com")
puts urls.inspect
8 голосов
/ 08 сентября 2010

Вы можете использовать регулярные выражения и .scan()

string.scan(/(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/)

Вы можете начать использовать это регулярное выражение и настроить его в соответствии со своими потребностями.

4 голосов
/ 08 сентября 2010

В каких случаях происходит сбой?

Согласно библиотеке regexpert , вы можете использовать

regexp = /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix

, а затем выполнить scan для текста.

РЕДАКТИРОВАТЬ: похоже, регулярное выражение поддерживает пустую строку.Просто удалите начальный (^$) и все готово

0 голосов
/ 27 сентября 2015

Если ваш ввод выглядит примерно так:

"http://i.imgur.com/c31IkbM.gifv;http://i.imgur.com/c31IkbM.gifvhttp://i.imgur.com/c31IkbM.gifv"

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

def process_images(raw_input)
  return [] if raw_input.nil?
  urls = raw_input.split('http')
  urls.shift
  urls.map { |url| "http#{url}".strip.split(/[\s\,\;]/)[0] }
end

Надеюсь, это поможет!

0 голосов
/ 09 декабря 2014
require 'uri'    
foo = #<URI::HTTP:0x007f91c76ebad0 URL:http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg>
foo.to_s
=> "http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg"

редактировать: объяснение

Для тех, у кого возникли проблемы с анализом URI через ответы JSON или с помощью инструмента очистки, такого как Nokogiri или Mechanize, это решение сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...