2010-02-17 6 views
16

मैं इस तरह 'कीवर्ड' विशेषता का चयन करने के nokogiri उपयोग कर रहा हूँ:मैं एक नोकोगिरी केस असंवेदनशील एक्सपैथ चयनकर्ता कैसे बना सकता हूं?

puts page.parser.xpath("//meta[@name='keywords']").to_html 

पृष्ठों के साथ मैं काम कर रहा हूँ से एक एक राजधानी "के" जो मुझे बनाने के लिए प्रेरित किया है, जिसमें उन कीवर्ड्स लेबल है क्वेरी केस असंवेदनशील।

<meta name="keywords"> AND <meta name="Keywords"> 

तो, मेरा सवाल है: एक नोकोगिरी चयन केस असंवेदनशील बनाने का सबसे अच्छा तरीका क्या है?

संपादित करें नीचे की टोमालक का सुझाव इस विशिष्ट समस्या के लिए बहुत अच्छा काम करता है। मैं इस उदाहरण का उपयोग नोकोगिरी को बेहतर समझने में मदद करने के लिए भी करना चाहता हूं, और कुछ ऐसे मुद्दे हैं जिनके बारे में मैं सोच रहा हूं और सफल खोज नहीं कर रहा हूं। उदाहरण के लिए, रेगेक्स 'छद्म वर्ग' Nokogiri Docs इस तरह की समस्या के लिए उपयुक्त हैं?

मैं भी मैक के बारे में उत्सुक हूं?() विधि नोकोगिरी में। मैं विधि पर कोई स्पष्टीकरण नहीं मिला है। क्या XPath 2.0 में 'मैचों' अवधारणा के साथ इसका कोई संबंध नहीं है (और इसलिए इसका उपयोग इस समस्या को हल करने के लिए किया जा सकता है)?

बहुत बहुत धन्यवाद।

+1

+1 - अच्छा सवाल। एसओ में आपका स्वागत है :) –

उत्तर

9

स्पष्टता के लिए लिपटा:

puts page.parser.xpath(" 
    //meta[ 
    translate(
     @name, 
     'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
     'abcdefghijklmnopqrstuvwxyz' 
    ) = 'keywords' 
    ] 
").to_html 

, XPath 1.0 में कोई "लोअर केस में" समारोह नहीं है तो तुम बात इस तरह का के लिए translate() उपयोग करना होगा। आवश्यकतानुसार उच्चारण अक्षरों को जोड़ें।

+0

धन्यवाद टोमालक। यह समाधान मेरे लिए अच्छा काम कर रहा है। – Rick

+0

एफवाईआई, वीटीडी-एक्सएमएल का एक्सपैथ 1.0 वास्तव में कुछ प्रकार के इंटरमीडिएट चरण 2.0 –

19

नोकोगिरी कस्टम XPath कार्यों की अनुमति देता है। जब आप केवल एक बार इसका उपयोग कर रहे हों तो नोकोगिरी दस्तावेज़ जो आप एक इनलाइन क्लास परिभाषा दिखाने के लिए लिंक करते हैं। यदि आपके पास बहुत से कस्टम फ़ंक्शन हैं या यदि आप केस-असंवेदनशील मैच का बहुत उपयोग करते हैं, तो आप इसे कक्षा में परिभाषित करना चाहेंगे।

class XpathFunctions 

    def case_insensitive_equals(node_set, str_to_match) 
    node_set.find_all {|node| node.to_s.downcase == str_to_match.to_s.downcase } 
    end 

end 

फिर इसे किसी अन्य XPath फ़ंक्शन की तरह कॉल करें, जो आपकी कक्षा के उदाहरण में दूसरे तर्क के रूप में गुज़र रहा है।

page.parser.xpath("//meta[case_insensitive_equals(@name,'keywords')]", 
        XpathFunctions.new).to_html 

अपने रूबी विधि में, node_set एक Nokogiri::XML::NodeSet के लिए बाध्य होंगे। यदि आप @name जैसे विशेषता मान में गुजर रहे हैं, तो यह एक Nokogiri::XML::Attr के साथ एक नोडसेट होगा। इसलिए to_s पर कॉल करने से आपको इसका मूल्य मिल जाता है। (वैकल्पिक रूप से, आप node.value का उपयोग कर सकते हैं।)

XPath translate का उपयोग करने के विपरीत जहां आपको प्रत्येक चरित्र निर्दिष्ट करना है, यह रूबी पर काम करने वाले सभी पात्रों और चरित्र एन्कोडिंग पर काम करता है।

इसके अलावा, यदि आप अन्य चीजों को करने में रुचि रखते हैं तो केस-असंवेदनशील मिलान के अलावा XPath 1.0 का समर्थन नहीं करता है, यह इस बिंदु पर रूबी है। तो यह एक अच्छा प्रारंभिक बिंदु है।

+0

के रूप में ऊपरीकेस और लोअरकेस लागू करता है बहुत ही सुरुचिपूर्ण समाधान! – Severin

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