Nokogiri的奇怪问题

时间:2010-08-10 16:24:46

标签: ruby-on-rails ruby nokogiri

说,我们有一个HTML,其中,所有......

<div class="replace-me">
</div>

...必须替换为

<video src='my_video.mov'></video>

代码如下:

doc.css("div.replace-me").each do |div|
  div.replace "<video src='my_video.mov'></video>"
end

这很简单,但不幸的是,它对我不起作用。 Nokogiri因以下错误而崩溃:

  

未定义的方法children' for nil:NilClass /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/whiny_nil.rb:52:in method_missing'   /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/html/document_fragment.rb:16:in initialize' /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/xml/node.rb:424:in new'   /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/xml/node.rb:424:in fragment' /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/xml/node.rb:776:in coerce'   /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/xml/node.rb:331:in`replace'

替换原始div确实有效:

doc.css("div.replace-me").each do |div|
  div.replace "<div>Test</div>"
end

这是一个Nokogiri错误,还是我做错了什么?

PS:与“add_child”,“inner_html”和其他用于此目的的setter相同的问题

3 个答案:

答案 0 :(得分:0)

我将引用您之前提问的评论:

  

这是因为HTML严格性(HTML有一组预定义的元素)。用Nokogiri :: XML(self.content)替换Nokogiri :: HTML(self.content),不要忘记稍后手动添加DOCTYPE声明。

答案 1 :(得分:0)

如果您查看日志,您使用nokogiri选择的部分将变为零。

你会这样试试吗?

doc.css(".replace-me").each do |div|
 div.replace "<video src='my_video.mov'></video>"
end

或者您可能需要指定要替换的元素。

答案 2 :(得分:0)

我无法重复这个问题。当然,这个问题很旧,但这可行:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div class="replace-me">
</div>
EOT

It could have been a Ruby 1.8 issue, an issue with that version of Nokogiri, or something was wrong in your libXML... it's hard to say given the information in the question.

doc.at('div.replace-me').replace("<video src='my_video.mov'></video>")
doc.to_html
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n" +
#    "<html><body>\n" +
#    "<video src=\"my_video.mov\"></video>\n" +
#    "</body></html>\n"