如何使用Ruby的Sanitize/Nokogiri访问未标记的元素?

如何使用Ruby的Sanitize/Nokogiri访问未标记的元素?,ruby,nokogiri,sanitize,Ruby,Nokogiri,Sanitize,我正在尝试构建一个转换器,该转换器接受可能存在格式错误的HTML输入,其元素完全位于任何标记之外,例如在本例中: out of a tag<p>in a tag</p>out again! 我想让转换器将所有未标记的元素包装在标记中,以便将上述内容转换为: <p>out of a tag</p><p>in a tag</p><p>out again!</p> 不幸的是,我不知道如何选择未标记的元素

我正在尝试构建一个转换器,该转换器接受可能存在格式错误的HTML输入,其元素完全位于任何标记之外,例如在本例中:

out of a tag<p>in a tag</p>out again!
我想让转换器将所有未标记的元素包装在标记中,以便将上述内容转换为:

<p>out of a tag</p><p>in a tag</p><p>out again!</p>
不幸的是,我不知道如何选择未标记的元素,因为它不是节点。我肯定我错过了什么。有人能给我一个正确的方向吗

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::Nodechildren


文本存储在文本节点中。因为CSS不能选择文本节点,所以您必须使用其他方法来获取它们,比如Nokogiri::XML::Nodechildren。

太棒了,我来试试。谢谢@亚伦:如果这回答了你的问题,你能点击我答案顶部附近的复选图标吗?它将把这个问题标记为已回答。谢谢您好,Adrian,您的示例在irb会话中效果很好,但是从transformer lambda的上下文来看,lambda只会被调用一次,用于标记

段中的:事实证明,最好是在一个消毒转换器中放弃这样做的想法,而在整个html文档中单独运行Nokogiri则更简单。但你给我的分数让我走上了正确的道路!:太棒了,我要试一试。谢谢@亚伦:如果这回答了你的问题,你能点击我答案顶部附近的复选图标吗?它将把这个问题标记为已回答。谢谢您好,Adrian,您的示例在irb会话中效果很好,但是从transformer lambda的上下文来看,lambda只会被调用一次,用于标记

段中的:事实证明,最好是在一个消毒转换器中放弃这样做的想法,而在整个html文档中单独运行Nokogiri则更简单。但你给我的分数让我走上了正确的道路!: