【问题标题】:Need to remove newlines from object/embed tags only using Nokogiri只需要使用 Nokogiri 从对象/嵌入标签中删除换行符
【发布时间】:2011-06-04 10:16:03
【问题描述】:

我需要从任何对象/嵌入标签中删除换行符。我目前正在尝试通过执行以下操作来使用 Nokogiri:

s = "<div>
<object height='450' width='600'>
<param name='allowfullscreen' value='true'>
<param name='allowscriptaccess' value='always'>
<param name='movie' value='http://vimeo.com/moogaloop.swf?clip_id=3317924&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1'>
<embed src='http://vimeo.com/moogaloop.swf?clip_id=3317924&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1' type='application/x-shockwave-flash' allowfullscreen='true' allowscriptaccess='always' height='450' width='600'>
</embed>
</object>
</div>"
doc = Nokogiri::HTML(s)
doc.css('object').each { |o| o.inner_html.gsub!(/\n/, ""); puts o.inner_html }

请注意,该示例仅适用于对象标签。

在块的末尾打印 o.inner_html 表明没有发生替换,即使 gsub 文本看起来是正确的。此外,一旦解决了该部分,我需要确保 doc 对象中的实际 object 节点与更新的值一起保存。

非常感谢任何帮助。谢谢。

【问题讨论】:

  • a) 我会通过 doc.xpath('//object/text()').each{ |t| t.remove } 删除空格; b) 这样做没有帮助; c) 即使您删除源中参数之间的空格,您也会看到它出现在输出中。问题在于序列化,而不是文档表示。
  • doc.xpath('//object/text()') 在此示例中不返回任何内容。
  • "doc.xpath('//object/text()') 在此示例中不返回任何内容"。实际上确实如此。它返回[#&lt;Nokogiri::XML::Text:0x80899cb8 "\n"&gt;]
  • 一定是打错了什么,确实如此。
  • 不过还是没有回答我上面的问题。

标签: ruby-on-rails ruby replace newline nokogiri


【解决方案1】:

知道了!

require 'nokogiri'
s = <<ENDHTML
<div>
<object height='450' width='600'>
  <param name='allowfullscreen' value='true'><param name='allowscriptaccess' value='always'>
  <param name='movie' value='http://vimeo.com/moogaloop.swf?clip_id=3317924&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1'>
<embed src='http://vimeo.com/moogaloop.swf?clip_id=3317924&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1' type='application/x-shockwave-flash' allowfullscreen='true' allowscriptaccess='always' height='450' width='600'>
</embed>
</object>
</div>
ENDHTML

doc = Nokogiri::HTML(s)
doc.css('object,embed').each{ |e| e.inner_html = e.inner_html.gsub(/\n/,'') }
puts doc.serialize( save_with: 0 )

#=> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#=> <html><body><div>
#=> <object height="450" width="600"><param name="allowfullscreen" value="true"><param name="allowscriptaccess" value="always"><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3317924&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1"><embed src="http://vimeo.com/moogaloop.swf?clip_id=3317924&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="450" width="600"></embed></object>
#=> </div></body></html>
  1. 删除所有文本节点并不能完全清除文档;您需要使用inner_html
  2. 调用inner_html.gsub!inner_html = inner_html.gsub不同。
  3. 如图所示,您需要使用 serialize 和传入的哈希 :save_with =&gt; 0,以防止 Nokogiri 在输出中的标签之间生成换行符。

【讨论】:

  • 效果很好——你太棒了,先生!我所做的唯一细微更改是将最后一行更改为 puts doc.css('body').children.first.serialize(:save_with =&gt; 0) 以避免打印 doctype、html 和 body 标签。
  • 仅供参考 - save_with: 0 应在上面的代码区域中更改为 :save_with =&gt; 0。再次感谢。
  • @modulaaron 抱歉,这是带有符号键的 1.9 哈希语法;是的,对于 1.8.x,您将需要该语法。
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2012-02-20
相关资源
最近更新 更多