2010-07-07 15 views
21

हैप्रिकॉट के साथ करने के लिए कठिन कारणों के लिए, मुझे एक यूआरएल पारित करने वाला एक फ़ंक्शन लिखना होगा, और पृष्ठ की संपूर्ण सामग्री को एक स्ट्रिंग के रूप में वापस करना होगा।स्ट्रिंग के रूप में यूआरएल की सामग्री पुनर्प्राप्त करें

मैं करीब हूं। मुझे लगता है मैं OpenURI उपयोग करने की आवश्यकता है, और यह कुछ इस तरह दिखना चाहिए:

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

किसी को भी मैं क्या जोड़ने की जरूरत का सुझाव कर सकते हैं?

उत्तर

16

open विधि अपने ब्लॉक करने के लिए संसाधन के IO प्रतिनिधित्व गुजरता है जब यह पैदावार। आप इसे से IO#read विधि

open([mode [, perm]] [, options]) [{|io| ... }] 
open(path) { |io| data = io.read } 
+0

धन्यवाद! और दृश्यों के पीछे क्या हो रहा है, यह बताने के लिए धन्यवाद। – AP257

+0

आप खींचने वाले एचटीएमएल में सापेक्ष संपत्तियों के पथ को कैसे अपडेट करेंगे? – saihgala

50

के प्रलेखन आप 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 
+11

खुले uri का उपयोग करने का नुकसान यह क्या है? – Watusimoto

+3

हाँ, यह बहुत भ्रमित है कि इस अधिक जटिल जवाब के मुकाबले अन्य लोगों की तुलना में अधिक उछाल आया है। मैंने खुद को एक कारण खोजने की कोशिश की और पाया [यह प्रश्न/उत्तर] (http://stackoverflow.com/a/16764302/199712) जो ज्यादातर मामलों में नेट :: HTTP पर OpenURI की अनुशंसा करता है, जो चीजों को और अधिक भ्रमित करता है । धन्यवाद, ओबामा –

+4

ओपन-यूरी आंतरिक रूप से 'कर्नेल.ओपेन' पैच करता है। यहां एक [आलेख] (http://sakurity.com/blog/2015/02/28/openuri.html) चीजों के बारे में बात करना है जिसे ओपन-यूरी का उपयोग करते समय अवगत होना चाहिए। मैं बनी मणि (जो 'ओपन' लागू करता है) – EricC

-2

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

यह Teoulas द्वारा पहले बताए गए समाधान से अलग कैसे है? –

2

का उपयोग कर कोड एक छोटे से स्पष्ट बनाने के लिए पढ़ सकते हैं, OpenURI open विधि ब्लॉक द्वारा दिए गए मान वापस आ जाएगी, ताकि आप अपने चर को open की वापसी मान असाइन कर सकते हैं। उदाहरण के लिए:

xml_text = open(url) { |io| io.read } 
+0

अच्छा, यहां एक लाइनर है अमेज़ॅन ईसी 2 पब्लिक आईपी रेंज प्राप्त करें: 'रूबी-आर जेसन-ओपेन-यूरी-' जेएसओएन.परसे (ओपन ("https://ip-ranges.amazonaws.com/ip-ranges.json") {| io | io .read}) ["उपसर्ग"]। प्रत्येक {| p | puts # {p ["ip_prefix"] यदि पी ["सेवा"] == "ईसी 2"}; ' – akostadinov

+0

एक-लाइनर में निश्चित टाइपो: ' ruby -r json -r open-uri -e 'JSON.parse (खुला ("https://ip-ranges.amazonaws.com/ip-ranges।जेसन ") {| io | io.read}) [" उपसर्ग "]। प्रत्येक {| p | p [" ip_prefix "] डालता है यदि पी [" सेवा "] ==" ईसी 2 "}; '' – Magnus

4

मैं भी बहुत उलझन में क्या बेहतर प्रदर्शन और तेजी से परिणाम के लिए इस्तेमाल किया गया।

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) 

मैं कहना है कि यह आपकी आवश्यकता है क्या पर निर्भर करता है और कैसे आप कार्रवाई करने के लिए चाहते हैं करना चाहते हैं ।

-1

प्रयास करें बजाय निम्नलिखित:

require 'open-uri' 
content = URI(your_url).read 
संबंधित मुद्दे