Hpricotを使用する退屈な理由から、URLを渡して、ページのコンテンツ全体を単一の文字列として返す関数を作成する必要があります。
私は近いです。 OpenURIを使用する必要があることはわかっています。次のようになります。
require 'open-uri'
open(url) {
# do something mysterious here to get page_string
}
puts page_string
追加する必要があるものを誰かが提案できますか?
open
メソッドは、リソースのIO
表現を生成時にブロックに渡します。 IO#read
メソッド
open([mode [, perm]] [, options]) [{|io| ... }]
open(path) { |io| data = io.read }
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'))
require 'open-uri'
open(url) do |f|
page_string = f.read
end
IO class のドキュメントも参照してください
また、パフォーマンスの向上と迅速な結果を得るために何を使用するかについても非常に混乱しました。より明確にするために、両方のベンチマークを実行しました。
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)
それはあなたの要件が何であるか、そしてあなたがどのように処理したいかに依存すると私は言いたいです。
コードをもう少し明確にするために、OpenURI open
メソッドはブロックから返された値を返すため、open
の戻り値を変数に割り当てることができます。例えば:
xml_text = open(url) { |io| io.read }