2010-01-22 8 views
5

मैं कैसे nokogiri उपयोग करने के लिए सीख रहा हूँ और कुछ सवाल यह बेहतर उपयोग करने के लिए है नीचेकैसे nokogiri तरीकों .xpath और .at_xpath

require 'rubygems' 
require 'mechanize' 

post_agent = WWW::Mechanize.new 
post_page = post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708') 

puts "\nabsolute path with tbody gives nil" 
puts post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]').xpath('text()').to_s.strip.inspect 

puts "\n.at_xpath gives an empty string" 
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").at_xpath('text()').to_s.strip.inspect 

puts "\ntwo lines solution with .at_xpath gives an empty string" 
rows = post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]") 
puts rows[0].at_xpath('text()').to_s.strip.inspect 


puts 
puts "two lines working code" 
rows = post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]") 
puts rows[0].xpath('text()').to_s.strip 

puts "\none line working code" 
puts post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip 

puts "\nanother one line code" 
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").xpath('text()').to_s.strip 

puts "\none line code with full path" 
puts post_page.parser.xpath("/html/body/div/div/div/div/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip 
  • कोड के आधार पर मेरे पास आया उपयोग करने के लिए // या/xpath में? @AnthonyWJones कहता है कि 'एक अपरिवर्तित // // का उपयोग इतना अच्छा विचार नहीं है
  • मुझे किसी भी काम कर रहे xpath से किसी को हटा देना था अन्यथा मुझे' शून्य 'परिणाम मिला। चीजें काम करने के लिए xpath से तत्व को निकालना संभव है?
  • क्या मुझे पूर्ण xpath का उपयोग न करने पर डेटा निकालने के लिए दो बार .xpath का उपयोग करना होगा?
  • क्यों मैं डेटा निकालने के लिए .at_xpath काम नहीं कर सकता? यह अच्छी तरह से काम करता है here क्या अंतर है? तो यह और अधिक महंगा है /
  • करने के लिए आप प्लेसहोल्डर के रूप में उपयोग कर सकते हैं * तुलना

उत्तर

8
  1. // हर स्तर पर प्रत्येक नोड का मतलब है।
  2. नहीं, आप XPath क्वेरी बना सकते हैं, तत्व प्राप्त कर सकते हैं तो नोडोगिरी text विधि को नोड
  3. पर सुनिश्चित करें कि आप कर सकते हैं। this question और मेरी बेंचमार्क फ़ाइल पर एक नज़र डालें। आप at_xpath का एक उदाहरण देखेंगे।

मैंने पाया कि आप अक्सर text() अभिव्यक्ति का उपयोग करते हैं। यह नोकोगिरी का उपयोग करने की आवश्यकता नहीं है। आप नोड को पुनर्प्राप्त कर सकते हैं और नोड पर text विधि को कॉल कर सकते हैं। यह बहुत कम महंगा है।

यह भी ध्यान रखें कि नोकोगिरी .css चयनकर्ताओं का समर्थन करता है। यदि आप HTML पृष्ठों के साथ काम कर रहे हैं तो वे आसान हो सकते हैं।

+0

@ सिमोन कार्लेटी: इसके लिए आपको थक गया। शायद मेरे सभी प्रश्न आते हैं क्योंकि मुझे नहीं पता कि http://nokogiri.org पर दस्तावेज़ कैसे पढ़ा जाए, मुझे नहीं पता कि नोड पर टेक्स्ट विधि को कॉल करने के बारे में कुछ भी कैसे प्राप्त करें। इसके बारे में और लिखना संभव होगा। मुझे पहले से ही मेरी लिपि धीमी गति से मिलती है, इसे तेज़ी से बनाना बहुत अच्छा होगा। – Radek

+0

मैंने पाया कि एक XPath प्लेसहोल्डर वास्तविक xpath अभिव्यक्ति है। तो प्लेसहोल्डर के रूप में * का उपयोग करने का क्या अर्थ है? – Radek

+0

* किसी भी नोड का मतलब है। उदाहरण के लिए, '/ node/foo/one' और'/node/bar/one' में, '/ node/*/one' दोनों पथों से मेल खाता है। –