31

Hpricot を扱うには面倒な理由があるため、URL を渡されてページのコンテンツ全体を 1 つの文字列として返す関数を作成する必要があります。

私は近くにいます。OpenURI を使用する必要があることはわかっています。これは次のようになります。

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

追加する必要があるものを誰かが提案できますか?

4

8 に答える 8

61

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'))
于 2010-07-07T09:50:51.437 に答える
22

このopenメソッドは、IO生成時にリソースの表現をブロックに渡します。IO#readメソッドを使用してそれから読み取ることができます

open([mode [, perm]] [, options]) [{|io| ... }] 
open(path) { |io| data = io.read }
于 2010-07-07T10:00:46.810 に答える
12
require 'open-uri'
open(url) do |f|
  page_string = f.read
end

IO クラスのドキュメントも参照してください

于 2010-07-07T09:50:41.933 に答える
5

また、より良いパフォーマンスと迅速な結果を得るために何を使用するかについても非常に混乱していました. より明確にするために、両方のベンチマークを実行しました。

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)

要件と処理方法によって異なります。

于 2015-05-20T07:32:32.573 に答える
4

コードをもう少し明確にするために、OpenURIopenメソッドはブロックによって返された値を返すのでopen、変数に の戻り値を割り当てることができます。例えば:

xml_text = open(url) { |io| io.read }
于 2014-07-21T19:09:44.320 に答える
-1

代わりに次のことを試してください。

require 'open-uri' 
content = URI(your_url).read
于 2015-10-30T12:14:23.800 に答える
-2

require 'open-uri'
open(url) {|f|  #url must specify the protocol
str = f.read()
}
于 2010-07-07T09:56:04.580 に答える