2011-08-22 17 views
5

मैं प्रोग्रामर के लिए नौसिखिया हूं, इसलिए मेरी नवीनता बहाना। तो मैं एक पुलिस अपराध लॉग स्क्रैप करने के लिए नोकोगिरी का उपयोग कर रहा हूं। यहाँ कोड के नीचे है:नोकोगिरी: शून्य के लिए त्रुटि "अपरिभाषित विधि 'पाठ में चल रहा है: नील क्लास"

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

url = "http://www.sfsu.edu/~upd/crimelog/index.html" 
doc = Nokogiri::HTML(open(url)) 
puts doc.at_css("title").text 
doc.css(".brief").each do |brief| 
puts brief.at_css("h3").text 
end 

मैं लॉग के लिए CSS चयनकर्ता खोजने के लिए चयनकर्ता गैजेट बुकमार्कलेट का इस्तेमाल किया (.brief)। जब मैं संक्षिप्त.at_css के माध्यम से "एच 3" पास करता हूं तो मुझे सामग्री के साथ सभी एच 3 टैग मिलते हैं।

हालांकि, अगर मैं टैग को हटाने के लिए .text विधि जोड़ता हूं, तो मुझे NoMethod त्रुटि मिलती है।

क्या ऐसा कोई कारण है कि यह क्यों हो रहा है? मैं क्या खो रहा हूँ? धन्यवाद!

उत्तर

8

स्पष्ट करने के लिए यदि आप HTML स्रोत की संरचना को देखो आपको लगता है कि <div class="brief"> की बहुत पहली घटना में एक बच्चे h3 टैग नहीं होता देखेंगे (यह वास्तव में केवल एक बच्चे <p> टैग है)।

Nokogiri Docs का कहना है कि

at_css (* नियम)

सीएसएस नियमों की पहली घटना के लिए इस नोड खोजें। सीएसएस (नियम) के बराबर। सबसे अधिक जानकारी के लिए सबसे पहले नोड # सीएसएस देखें।

यदि आप at_css(*rules) पर कॉल करते हैं तो दस्तावेज़ बताते हैं कि यह css(rules).first के बराबर है। वहाँ आइटम हैं जब (अपने .brief वर्ग एक h3 होता है) तो एक Nokogiri::XML::Element वस्तु दिया जाता है जो, text का जवाब जबकि अगर आपके .brief शामिल नहीं है एक h3 तो एक NilClass वस्तु दिया जाता है, जो निश्चित रूप से text

का जवाब नहीं है

तो अगर हम कहते हैं css(rules) (नहीं at_css आप के रूप में) हम एक Nokogiri::XML::NodeSet वस्तु लौट आए हो, जो text() पद्धति के रूप में परिभाषित किया गया है (नोटिस alias)

# Get the inner text of all contained Node objects 
    def inner_text 
    collect{|j| j.inner_text}.join('') 
    end 
    alias :text :inner_text 

क्योंकि कक्षा Enumerable है, यह अपने बच्चों को inner_text विधि पर कॉल करने के लिए पुन: सक्रिय करती है और उन सभी को एक साथ जोड़ती है।

इसलिए आप या तो एक nil? जांच कर सकते हैं या के रूप में @floatless सही ढंग से कहा गया है बस छोड़कर css विधि

+0

बहुत बढ़िया यह किया! बहुत बहुत धन्यवाद! – aboutaaron

4

आपको at_css को css के साथ प्रतिस्थापित करने की आवश्यकता है और सबकुछ ठीक होना चाहिए।

+0

का उपयोग करने वाले 'css', वापस आने वाले nodeset, जहां' at_css' एक नोड रिटर्न तो nodeset होने की आवश्यकता होगी पर पुनरावृत्त –

+0

सिवाय इसके कि आप नोडसेट पर #inner_text भी कॉल कर सकते हैं। चाहे वह वही करेगा जो आप चाहते हैं कि 1 मैचों में होने पर आप क्या करना चाहते हैं। यदि हमेशा 0 या 1 होते हैं, तो संभवतः यह वही होगा जो आप चाहते हैं। – jrochkind

संबंधित मुद्दे