2011-10-27 9 views
10

मुझे समस्या का सामना करना पड़ा है कि वर्तमान तत्व से पहले स्तर के बच्चों को कैसे ढूंढें?नोकोगिरी रेल में पहले स्तर के बच्चों को ढूंढें

<table> 
    <tr>abc</tr> 
    <tr>def</tr> 
    <table> 
    <tr>second</tr> 
    </table> 
</table> 

मैं रेल के लिए Nokogiri उपयोग कर रहा हूँ:

table = page.css('table') 
table.css('tr') 

यह रिटर्न सब trtable अंदर उदाहरण के लिए मैं HTML की है। लेकिन मुझे केवल 2 की आवश्यकता है जो तालिका के लिए पहला स्तर है।

उत्तर

19

जब आप कहते हैं कि यह:

table = page.css('table') 

तुम सिर्फ शीर्ष स्तर तालिका से दोनों तालिकाओं हथियाने रहे हैं बल्कि। तो आप या तो दस्तावेज़ जड़ के लिए वापस जाओ और एक चयनकर्ता कि केवल पहले तालिका में पंक्तियों से मेल खाता है का उपयोग के रूप में mosch कहते हैं या आप table ठीक कर सकते हैं केवल कुछ इस तरह से बाहरी तालिका होने के लिए कर सकते हैं:

table = page.css('table').first 
trs = table.xpath('./tr') 

या यहां तक ​​कि इस (एचटीएमएल की वास्तविक संरचना के आधार पर):

table = page.xpath('/html/body/table') 
trs = table.xpath('./tr') 

या शायद table के लिए इनमें से किसी एक (धन्यवाद Phrogz, फिर से):

table = page.at('table') 
table = page.at_css('table') 
# or various other CSS and XPath incantations 
+2

आप 'page.at ('table')' या 'page.at_css ('table')' 'के बजाय' page.css ('तालिका')। first'। – Phrogz

+0

@Phrogz: धन्यवाद, मैंने मिश्रण में भी उन्हें फेंक दिया। –

+0

इसे बहुत दूर लेने के जोखिम पर: page.xpath ('// table [not (पूर्वज :: * [1] [नाम() = "तालिका"])]') – pguardiario

5

आप क्या कर सकते हैं

rows = page.css('body > table > tr') 

शायद आप

+0

नहीं है, क्योंकि यह इस सीए आप भी आंतरिक तालिका – WarHog

+0

में निहित tr तत्व का चयन किया, वास्तव में, धन्यवाद! जवाब संपादित किया। – moritz

+1

आप एचटीएमएल –

1

एक और तरीका है (मैं 'शरीर' यहाँ चुना है) के रूप में अभी तक अपने कंटेनर तत्व को चयनकर्ता अनुकूल करने के लिए है, तो आप कुछ इस तरह इस्तेमाल करने की कोशिश कर सकते हैं :

text = <<HERE 
    <table> 
    <tr>abc</tr> 
    <tr>def</tr> 
    <table> 
     <tr>second</tr> 
    </table> 
    </table> 
HERE 
xml = Nokogiri::XML(text) 
xml.xpath("/table/tr/").each do |node| 
    puts node.text 
end 

इस उदाहरण में, '/ table/tr' अभिव्यक्ति हमारे मामले में आवश्यक तत्व - 'tr' के पूर्ण पथ का प्रतिनिधित्व करती है।

+0

तालिका के प्रत्यक्ष वंशज प्राप्त करने के लिए 'table.css ('> tr ')' भी कर सकते हैं क्योंकि यह HTML है, आप वास्तव में Nokogiri :: HTML का उपयोग करना चाहते हैं। इसके अलावा आपके xpath में पिछला स्लैश इसे तोड़ देता है। – pguardiario

+0

ओह, ये मेरे टाइपो हैं - आप पूरी तरह से सही हैं, मेरी माफ़ी :) :) – WarHog

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