说,我们有一个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:ininitialize' /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:infragment' /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相同的问题
答案 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"