2014-02-22 47 views
0

因此,我的目標是在一段範圍內的首段之後包裝所有段落。我試圖弄清楚如何在單個跨度中包裝節點集,並且.wrap()將每個節點包裝在自己的跨度中。正如在想:如何在一個範圍中包裝Nokogiri節點集

<p>First</p> 
<p>Second</p> 
<p>Third</p> 

要成爲:

<p>First</p> 
<span> 
<p>Second</p> 
<p>Third</p> 
</span> 

任何樣本代碼,以幫助?謝謝!

+5

如果這是HTML,請注意'span'中的'p'無效。 – matt

回答

1

我下面做:

require 'nokogiri' 

doc = Nokogiri::HTML::DocumentFragment.parse(<<-html) 
<p>First</p> 
<p>Second</p> 
<p>Third</p> 
html 

nodeset = doc.css("p") 
new_node = Nokogiri::XML::Node.new('span',doc) 
new_node << nodeset[1..-1] 
nodeset.first.after(new_node) 
puts doc.to_html 
# >> <p>First</p><span><p>Second</p> 
# >> <p>Third</p></span> 
# >> 
+0

Ps:使用片段而不是文檔。 – Phrogz

+0

我的意思是http://nokogiri.org/Nokogiri/HTML/DocumentFragment.html#method-c-parse – Phrogz

+0

@Progrog是的..這是一個錯字。但如何做漂亮的打印? –

0

我會做這樣的事情:

require 'nokogiri' 

html = '<p>First</p> 
<p>Second</p> 
<p>Third</p> 
' 

doc = Nokogiri::HTML(html) 

paragraphs = doc.search('p')[1..-1].unlink 
doc.at('p').after('<span>') 
doc.at('span').add_child(paragraphs) 
puts doc.to_html 

導致HTML看起來像:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body> 
<p>First</p> 
<span><p>Second</p> 
<p>Third</p></span> 

</body></html> 

舉你知道發生了什麼,下面是一個更詳細的輸出,顯示了doc的中間變化:

paragraphs = doc.search('p')[1..-1].unlink 
paragraphs.to_html 
# => "<p>Second</p><p>Third</p>" 
doc.at('p').after('<span>') 
doc.to_html 
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n<p>First</p>\n<span></span>\n\n</body></html>\n" 
doc.at('span').add_child(paragraphs) 
doc.to_html 
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n<p>First</p>\n<span><p>Second</p>\n<p>Third</p></span>\n\n</body></html>\n" 

望着初始HTML,我不知道問的問題是要順利進行正常的日常工作,HTML,但是,如果你有絕對的把握它永遠不會從

<p>...</p> 
<p>...</p> 
<p>...</p> 
改變

佈局然後你應該沒問題。如果HTML確實如此,任何基於HTML,HTML樣本的回答都會很糟糕:

<div> 
    <p>...</p> 
    <p>...</p> 
    <p>...</p> 
</div> 
... 
<div> 
    <p>...</p> 
    <p>...</p> 
    <p>...</p> 
</div>