2011-08-14 3 views
6

मैं कोड im का एक टुकड़ा nokogiri कि इस तरह दिखता है के साथ पार्स करने का प्रयास किया है पर सामग्री को विभाजित करने के लिए Nokogiri का उपयोग करना:बीआर टैग

<td class="j"> 
    <a title="title text1" href="http://link1.com">Link 1</a> (info1), Blah 1,<br> 
    <a title="title text2" href="http://link2.com">Link 2</a> (info1), Blah 1,<br> 
    <a title="title text2" href="http://link3.com">Link 3</a> (info2), Blah 1 Foo 2,<br> 
</td> 

मैं कुछ इस तरह का उपयोग कर td.j के स्रोत की पहुंच है : data_items = doc.css("td.j")

मेरा लक्ष्य उन पंक्तियों में से प्रत्येक को हैश की सरणी में विभाजित करना है। एकमात्र तार्किक विभाजन बिंदु मैं देख सकता हूं कि बीआरएस पर विभाजित होना है और फिर स्ट्रिंग पर कुछ रेगेक्स का उपयोग करना है।

मैं सोच रहा था कि ऐसा करने के लिए शायद बेहतर तरीका है नोकोगिरी का उपयोग कर? यहां तक ​​कि अगर मैं 3 लाइन वस्तुओं को चूसने के लिए नोकोगिरी का उपयोग कर सकता हूं, तो यह मेरे लिए चीजों को आसान बना देगा क्योंकि मैं केवल सामग्री पर कुछ रेगेक्स पार्सिंग कर सकता हूं।

यकीन नहीं है कि ब्रोक के साथ समाप्त होने वाली लाइनों को पकड़ने के लिए नोकोगिरी का उपयोग कैसे करें - क्या मुझे xpaths का उपयोग करना चाहिए? किसी भी दिशा की सराहना की है! धन्यवाद

उत्तर

1

यदि आपका डेटा वास्तव में नियमित है और आपको <a> तत्वों से विशेषताओं की आवश्यकता नहीं है, तो आप <br> तत्वों के बारे में चिंता किए बिना प्रत्येक तालिका कक्ष के टेक्स्ट फॉर्म को पार्स कर सकते हैं। chunks में

[ 
    [ "Link 1 (info1), Blah 1", "Link 2 (info1), Blah 1", "Link 3 (info2), Blah 1 Foo 2" ], 
    [ "Link 4 (info1), Blah 2", "Link 5 (info1), Blah 2", "Link 6 (info2), Blah 2 Foo 2" ], 
    [ "Link 7 (info1), Blah 3", "Link 8 (info1), Blah 3", "Link 9 (info2), Blah 3 Foo 2" ], 
    [ "Link A (info1), Blah 4", "Link B (info1), Blah 4", "Link C (info2), Blah 4 Foo 2" ] 
] 

:

html में इस तरह कुछ HTML को देखते हुए:

<table> 
    <tbody> 
     <tr> 
      <td class="j"> 
       <a title="title text1" href="http://link1.com">Link 1</a> (info1), Blah 1,<br> 
       <a title="title text2" href="http://link2.com">Link 2</a> (info1), Blah 1,<br> 
       <a title="title text2" href="http://link3.com">Link 3</a> (info2), Blah 1 Foo 2,<br> 
      </td> 
      <td class="j"> 
       <a title="title text1" href="http://link4.com">Link 4</a> (info1), Blah 2,<br> 
       <a title="title text2" href="http://link5.com">Link 5</a> (info1), Blah 2,<br> 
       <a title="title text2" href="http://link6.com">Link 6</a> (info2), Blah 2 Foo 2,<br> 
      </td> 
     </tr> 
     <tr> 
      <td class="j"> 
       <a title="title text1" href="http://link7.com">Link 7</a> (info1), Blah 3,<br> 
       <a title="title text2" href="http://link8.com">Link 8</a> (info1), Blah 3,<br> 
       <a title="title text2" href="http://link9.com">Link 9</a> (info2), Blah 3 Foo 2,<br> 
      </td> 
      <td class="j"> 
       <a title="title text1" href="http://linkA.com">Link A</a> (info1), Blah 4,<br> 
       <a title="title text2" href="http://linkB.com">Link B</a> (info1), Blah 4,<br> 
       <a title="title text2" href="http://linkC.com">Link C</a> (info2), Blah 4 Foo 2,<br> 
      </td> 
     </tr> 
    </tbody> 
</table> 

आप ऐसा कर सकता है:

chunks = doc.search('.j').map { |td| td.text.strip.scan(/[^,]+,[^,]+/) } 

और इस की है। फिर आप इसे जो भी हैश फॉर्म में बदल सकते हैं उसे बदल सकते हैं।

17

मुझे हैश की एक सरणी का उपयोग करने के बिंदु के बारे में निश्चित नहीं है, और उदाहरण के बिना मैं कुछ सुझाव नहीं दे सकता। हालांकि, <br> टैग पर पाठ विभाजित करने के लिए, मैं इसके बारे में जाना चाहते हैं इस तरह से:

require 'nokogiri' 

doc = Nokogiri::HTML('<td class="j"> 
    <a title="title text1" href="http://link1.com">Link 1</a> (info1), Blah 1,<br> 
    <a title="title text2" href="http://link2.com">Link 2</a> (info1), Blah 1,<br> 
    <a title="title text2" href="http://link3.com">Link 3</a> (info2), Blah 1 Foo 2,<br> 
</td>') 

doc.search('br').each do |n| 
    n.replace("\n") 
end 
doc.at('tr.j').text.split("\n") # => ["", " Link 1 (info1), Blah 1,", "Link 2 (info1), Blah 1,", "Link 3 (info2), Blah 1 Foo 2,"] 

यह आपको एक हैश के करीब मिल जाएगा:

Hash[*doc.at('td.j').text.split("\n")[1 .. -1].map{ |t| t.strip.split(',')[0 .. 1] }.flatten] # => {"Link 1 (info1)"=>" Blah 1", "Link 2 (info1)"=>" Blah 1", "Link 3 (info2)"=>" Blah 1 Foo 2"} 
+0

यह मेरे लिए काम किया। बहुत बहुत धन्यवाद! –

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