2010-07-08 67 views
2

这是previous question的延续。我在使用此Nokogiri片段时遇到了问题:这个Nokogiri命令为什么去掉HTML标签?

>> require 'nokogiri' 
>> html = 'bad<p>markup</p>with<img src="foo.jpg">' 
>> Nokogiri::HTML(html).at_css('body').children.map {|x| '<p>' + x.text + '</p>'}.join('') 
=> "<p>bad</p><p>markup</p><p>with</p><p></p>" 

我的图片标签发生了什么变化?看起来,Nokogiri可能会剥离所有存在的HTML标签(包括我的原始<p>围绕单词“标记”),并将其替换。我如何防止这种情况发生?所有我想要做的就是确保完全无标记的文本被包裹在一个<p>标签...

回答

2

只有包装在p标签的元素,如果它是一个文本节点,否则调用to_html它:

require 'nokogiri' 

html = 'bad<p>markup</p>with<img src="foo.jpg">' 

Nokogiri::HTML(html).at_css('body'). 
children.map do |x| 
    if x.text? 
    '<p>' + x.text + '</p>' 
    else 
    x.to_html 
    end 
end.join('') 
#=> "<p>bad</p>\n<p>markup</p><p>with</p><img src=\"foo.jpg\">" 
+0

啊,好吧,这是有道理的。谢谢! :) – 2010-07-08 16:20:19