2010-07-02 32 views
1

我试图建立一个Sanitize变压器接受任何标签的外部因素可能畸形的HTML输入可言,比如下面的例子:如何使用Ruby的Sanitize/Nokogiri访问未标记的元素?

out of a tag<p>in a tag</p>out again! 

我想有变压器包装任何未标签在<p>标签元素,因此,上述转变为:

<p>out of a tag</p><p>in a tag</p><p>out again!</p> 

不幸的是,我无法弄清楚如何选择未标记的元素,因为它不是一个节点。我确定我在这里错过了一些东西。有人能给我一个正确的方向吗?

回答

1
require 'nokogiri' 

html = 'out of a tag<p>in a tag</p>out again!' 

Nokogiri::HTML(html).at_css('body').children. 
    map {|x| '<p>' + x.text + '</p>' }.join('') 
#=> "<p>out of a tag</p><p>in a tag</p><p>out again!</p>" 

文本存储在文本节点中。由于CSS无法选择文本节点,因此您必须使用其他方法来获取它们,例如Nokogiri::XML::Node#children

+0

太棒了,我会试试这个。谢谢。 :) – 2010-07-02 20:58:47

+0

@Aaron:如果这回答了你的问题,你可以点击我答案顶部附近的支票图标吗?它会将这个问题标记为已回答。谢谢! – Adrian 2010-07-02 21:58:57

+0

嗨Adrian, 您的示例在irb会话中很好用,但是从变量lambda的上下文中,lambda只会被调用一次,对于标签

中的

段。 :( 原来,最好只是在Sanitize转换器中转储这样做的想法,并且在整个html文档中自行运行Nokogiri会更简单。 要点让你把我放在正确的道路上,但!:) – 2010-07-05 19:07:58