Получить содержимое URL в виде строки - PullRequest
24 голосов
/ 07 июля 2010

По утомительным причинам, связанным с Hpricot, мне нужно написать функцию, которой передается URL-адрес и которая возвращает все содержимое страницы в виде одной строки.

Я рядом.Я знаю, что мне нужно использовать OpenURI, и он должен выглядеть примерно так:

require 'open-uri'
open(url) {
  # do something mysterious here to get page_string
}
puts page_string

Кто-нибудь может подсказать, что мне нужно добавить?

Ответы [ 7 ]

55 голосов
/ 07 июля 2010

Вы можете сделать то же самое без OpenURI:

require 'net/http'
require 'uri'

def open(url)
  Net::HTTP.get(URI.parse(url))
end

page_content = open('http://www.google.com')
puts page_content

Или, более кратко:

Net::HTTP.get(URI.parse('http://www.google.com'))
21 голосов
/ 07 июля 2010

Метод open передает IO представление ресурса вашему блоку, когда он возвращает. Вы можете прочитать из него, используя IO#read метод

open([mode [, perm]] [, options]) [{|io| ... }] 
open(path) { |io| data = io.read }
11 голосов
/ 07 июля 2010
require 'open-uri'
open(url) do |f|
  page_string = f.read
end

См. Также документацию IO класса

4 голосов
/ 20 мая 2015

Меня также очень смущало, что использовать для повышения производительности и быстрых результатов. Я запустил тест для обоих, чтобы сделать его более понятным:

require 'benchmark'
require 'net/http'
require "uri"
require 'open-uri'

url = "http://www.google.com"
Benchmark.bm do |x|
  x.report("net-http:")   { content = Net::HTTP.get_response(URI.parse(url)).body if url }
  x.report("open-uri:")   { open(url){|f| content =  f.read } if url }
end

Его результат:

              user     system      total        real
net-http:  0.000000   0.000000   0.000000 (  0.097779)
open-uri:  0.030000   0.010000   0.040000 (  0.864526)

Я бы хотел сказать, что это зависит от ваших требований и способа обработки.

2 голосов
/ 21 июля 2014

Чтобы сделать код немного понятнее, метод OpenURI open вернет значение, возвращаемое блоком, поэтому вы можете присвоить возвращаемое значение open вашей переменной.Например:

xml_text = open(url) { |io| io.read }
0 голосов
/ 30 октября 2015

Попробуйте вместо этого:

require 'open-uri' 
content = URI(your_url).read
0 голосов
/ 07 июля 2010

require 'open-uri'
open(url) {|f|  #url must specify the protocol
str = f.read()
}
...