2011-08-14 43 views
6

我有代碼IM的一個片段試圖與引入nokogiri看起來像這樣來解析內容:使用引入nokogiri拆就BR標籤

<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")

我的目標是將這些行中的每一行分成一個哈希數組。我能看到的唯一的邏輯分割點是在BR上分割,然後在字符串上使用一些正則表達式。

我想知道是否有更好的方法來做到這一點,也許只使用nokogiri?即使我可以使用nokogiri來吸出3行項目,它會讓我更容易,因爲我可以對.content結果做一些正則表達式解析。

不知道如何使用Nokogiri抓住以br結尾的行 - 但我應該使用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

這爲我工作。非常感謝! –