2012-05-29 11 views
17

में एक टैग के अंदर सीधे पाठ जाओ मैं कुछ HTML ऐसा दिखता है जैसे की है। यदि वर्ष मौजूद है तो मुझे वर्ष 200 9 में विश्लेषण करना होगा।Nokogiri

मैं dt टैग के अंदर पाठ कैसे प्राप्त कर सकता हूं लेकिन a टैग के अंदर पाठ नहीं? मैंने record.search("dt").inner_text का उपयोग किया है और यह मुझे सबकुछ देता है।

यह एक मामूली सवाल है लेकिन मैंने इसे समझने में कामयाब नहीं रहा है।

+1

यह भी ध्यान रखें कि वहाँ 'dt' अंदर तथ्य दो पाठ नोड्स में हैं कि (जब तक आप 'noblanks' विकल्प का उपयोग करके HTML को पार्स किया गया): पहला टेक्स्ट नोड '' से पहले \ n" '\ n" 'है, और दूसरा टेक्स्ट नोड \ n (200 9) \ n" 'इसके बाद है। – Phrogz

उत्तर

16

पाठ के साथ सभी प्रत्यक्ष बच्चों, लेकिन नहीं किसी भी आगे की उप-बच्चों के लिए, आप तो जैसे XPath का उपयोग कर सकते हैं:

doc.xpath('//dt/text()') 

या आप खोज का उपयोग करना चाहते हैं तो:

doc.search('dt').xpath('text()') 
+3

उपर्युक्त विधियां आपको ['एक्सएमएल :: टेक्स्ट'] (http://nokogiri.org/Nokogiri/XML/Text.html) नोड्स का नोडसेट प्रदान करती हैं; आप एक परिणाम प्राप्त करने के लिए 'at_xpath' (या केवल' at') का उपयोग करना चाह सकते हैं, और तब उस नोड पर '.content' या' .text' विधियों को कॉल करें ताकि टेक्स्ट को स्ट्रिंग के रूप में प्राप्त किया जा सके। – Phrogz

5

dt तत्व दो बच्चे हैं, तो आप तक पहुँच सकते हैं:

doc.search("dt").children.last.text 
7

XPath टी का उपयोग करना o ठीक वही चुनें जो आप चाहते हैं (जैसा कि @ कैस्पर द्वारा सुझाया गया है) सही जवाब है।

def own_text(node) 
    # Find the content of all child text nodes and join them together 
    node.xpath('text()').text 
end 

यहाँ एक वैकल्पिक, मज़ा जवाब :)

def own_text(node) 
    node.clone(1).tap{ |copy| copy.element_children.remove }.text 
end 

कार्रवाई में देखा है:

require 'nokogiri' 
root = Nokogiri.XML('<r>hi <a>BOO</a> there</r>').root 
puts root.text  #=> hi BOO there 
puts own_text(root) #=> hi there 
संबंधित मुद्दे