Как извлечь URL из текста
Как извлечь все URL-адреса из обычного текстового файла в Ruby?
Я попробовал несколько библиотек, но в некоторых случаях они терпят неудачу. Какой лучший способ?
Ответы
Ответ 1
В каких случаях происходит сбой?
В соответствии с библиотекой regexpert вы можете использовать
regexp = /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix
а затем выполните текст scan
в тексте.
EDIT: Кажется, что regexp поддерживает пустую строку. Просто удалите начальную (^$)
и вы закончите
Ответ 2
Если вам нравится использовать то, что уже предусмотрено для вас в Ruby:
require "uri"
URI.extract("text here http://foo.example.org/bla and here mailto:[email protected] and here also.")
# => ["http://foo.example.org/bla", "mailto:[email protected]"]
Подробнее: http://railsapi.com/doc/ruby-v1.8/classes/URI.html#M004495
Ответ 3
Я использовал twitter-text gem
require "twitter-text"
class UrlParser
include Twitter::Extractor
end
urls = UrlParser.new.extract_urls("http://stackoverflow.com")
puts urls.inspect
Ответ 4
Вы можете использовать регулярное выражение и .scan()
string.scan(/(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/)
Вы можете начать работу с этим регулярным выражением и настроить его в соответствии с вашими потребностями.
Ответ 5
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, это решение сработало для меня.
Ответ 6
Если ваш ввод выглядит примерно так:
"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
Надеюсь, что это поможет!