2013-08-31 103 views
1

Nokogiri::XML::DocumentFragment中刪除所有標籤的簡單方法是什麼?只保留空格分隔的文本?如何將HTML標記轉換爲純文本?

我想改造:

Hello<br>My name is McOmghall 

到:

Hello My name is McOmghall 

我的解決辦法是:

Nokogiri::XML.fragment(html_text).children.to_a.flatten.select { |node| node.class == Nokogiri::XML::Text} 

,然後串聯數組將每個元素之間的空間,但我認爲它不是最理想的,也不是很清楚。


編輯:

這是我的最終解決方案:

Nokogiri::XML.fragment(html_text).xpath('.//text()').map(&:text).join(' ') 
+0

是否要替換原有文檔或僅輸出所提到的格式?這是一個混亂.. –

+0

只有輸出,但我不介意修改原來的。 –

回答

5
root = Nokogiri::HTML('<div id="test">Hello<br>My name is McOmghall</div>') 
root.at_css('#test').text 
# => "HelloMy name is McOmghall" 
root.at_css('#test').xpath('.//text()').map(&:text) 
# => ["Hello", "My name is McOmghall"] 
p root.at_css('#test').xpath('.//text()').map(&:text).join(' ') 
# => "Hello My name is McOmghall" 
0

如果之前或br後有沒有空間,也不會有在文本

空間
doc = Nokogiri::HTML 'Hello<br>My name is McOmghall' 
doc.text 
#=> "HelloMy name is McOmghall" 

它'很容易每br雖然後添加一個空格:

doc.search('br').each{|br| br.after ' '} 
doc.text 
#=> "Hello My name is McOmghall" 
2

Nokogiri有一個非常方便的方法text?這種情況:

html = "Hello<br>My name is McOmghall"  

Nokogiri::HTML.fragment(html).children.select(&:text?).join(' ') 
# => "Hello My name is McOmghall"