如果您將文檔創建爲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>
要解決這個問題,你需要讓你的源是有效的XML通過自動關閉你的void元素(這對HTML5也是有效的)。此外,爲避免XML聲明,您需要分別序列化DTD和根:
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>
類似問題:http://stackoverflow.com/questions/5459832/how-can-i-make-empty- tags-self-closing-with-nokogiri – 18bytes
它是_invalid_關閉標籤?那是什麼樣的設計決定? –
@MarkThomas一個奇怪的,特別是考慮到合法的結束斜線。 _「起始標籤由可選的」/「字符組成**,僅當元素爲空元素時纔可以出現**。[...] Void元素只有開始標籤; **不能爲空元素**指定結束標記。「_有關更多信息,請參見[void elements](http://www.w3.org/TR/html-markup/syntax.html#syntax-elements)。 – Phrogz