使用Nokogiri,我手动创建<video>
和<source>
标记。我的代码如下所示:
mp4_source_tag = html.create_element('source')
tag.replace(mp4_source_tag)
mp4_source_tag['type'] = 'video/mp4'
mp4_source_tag['src'] = video.mp4_video.url
生成以下HTML:
<source type="video/mp4" src="/system/mp4_videos/1/original/trailer.mp4?1347088365"></source>
然而,这是无效的HTML5。正确的输出应该是:
<source type="video/mp4" src="/system/mp4_videos/1/original/trailer.mp4?1347088365">
如果没有结束</source>
标记,我如何使用Nokogiri输出有效的HTML5?
替换后的代码是<img>
代码,但这似乎无关紧要。
答案 0 :(得分:0)
如果您将文档创建为XML而不是HTML,Nokogiri将输出带有结束斜杠的空元素,例如: <source />
;这对HTML5有效。
html = Nokogiri.HTML('')
puts html.create_element('source')
#=> <source></source>
xml = Nokogiri.XML('')
puts xml.create_element('source')
#=> <source/>
然而,其缺点是将有效的HTML5文档解析为XML将导致解析错误:
require 'nokogiri'
html5 = '<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
<title>Test</title>
</head><body>
<img src="a.jpg"><img src="b.jpg">
</body></html>'
doc = Nokogiri.XML( html5, &:noblanks )
puts doc
#=> <?xml version="1.0"?>
#=> <!DOCTYPE html>
#=> <html>
#=> <head>
#=> <meta charset="utf-8">
#=> <title>Test</title>
#=> </meta>
#=> <body>
#=> <img src="a.jpg">
#=> <img src="b.jpg">
#=> </img>
#=> </img>
#=> </body>
#=> </head>
#=> </html>
要解决此问题,您需要通过自动关闭void元素(对HTML5也有效)来使源成为有效的XML。此外,为避免XML声明,您需要单独序列化DTD和root:
require 'nokogiri'
html5 = '<!DOCTYPE html>
<html><head>
<meta charset="utf-8"/>
<title>Test</title>
</head><body>
<img src="a.jpg"/><img src="b.jpg"/>
</body></html>'
doc = Nokogiri.XML( html5, &:noblanks )
puts doc.children.map(&:to_s)
#=> <!DOCTYPE html>
#=> <html>
#=> <head>
#=> <meta charset="utf-8"/>
#=> <title>Test</title>
#=> </head>
#=> <body>
#=> <img src="a.jpg"/>
#=> <img src="b.jpg"/>
#=> </body>
#=> </html>