2013-05-13 58 views
0

下面的代碼我的屬性的值:引入nokogiri失去名爲「多」

require 'nokogiri' 

doc = Nokogiri::HTML("<!DOCTYPE html><html><input multiple='false' id='test' some='2'/><div multiple='false'></div></html>") 

puts doc.errors 

doc.css("input").each do |el| 
    puts el.attributes['multiple'] 
end 

puts doc.to_html 

而這裏的輸出:

false 
<!DOCTYPE html> 
<html><body> 
<input multiple id="test" some="2"><div multiple></div> 
</body></html> 
[Finished in 2.0s] 

哪兩處=「假」?

編輯

加,有沒有辦法調低默認修正? (使用to_xhtml可以保留='false',而CDATA插入腳本標記)

在我的選項中,to_xhtml似乎工作更嚴格,爲什麼to_xhtml保持multiple ='false'而不是?

EDIT2

這裏是我暫時的解決辦法:GSUB(/多= /, 'blahhhhh')解析之前和GSUB(/ blahhhhh /, '多=')解析

後回
+0

'這兩個'假'?'哪裏?只有一個「false」和一個「true」' – 2013-05-13 13:49:52

回答

1

to_html替換爲to_xhtml,您將再次獲得multiple屬性值。

require 'nokogiri' 
doc = Nokogiri::HTML("<!DOCTYPE html><html><input multiple='false' id='test' some='2'/><div multiple='true'></div></html>") 
puts doc.to_xhtml 

將輸出

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <body> 
    <input multiple="false" id="test" some="2" /> 
    <div multiple="true"></div> 
    </body> 
</html> 

更新這是因爲在HTML中multiple屬性(以及其他屬性,disabledselected)不需要有一個值,從而引入nokogiri去掉它來清潔輸出代碼。

更新2

爲什麼to_xhtml保持多個= '假' 呢?

因爲XHTML不允許忽略屬性的值,所以Nokogiri保留它們。

我認爲,您可以做的最好的事情是首先爲Nokogiri提供正確的HTML代碼,即完全省略multiple屬性,而不是編寫multiple="false"

+0

我也測試過to_xhtml的作品,但是xhtml帶來了更多的HTML5問題,仍然在調試 – rhapsodyn 2013-05-13 12:48:02

+1

@ rhapsodyn如果你使用的是HTML5請記住'multiple' ,'multiple =「true」'和'multiple =「false」'都是等價的。 – toro2k 2013-05-13 13:51:04

+0

'瀏覽器忽略了這些屬性的值。'Nokogiri不是瀏覽器,它是一個解析器,它對HTML規範中標記應該看起來像什麼有一個好主意,所以它不會顯示「=」false 「'或'=」true「'當您使用'to_html'請求HTML輸出時。它正在做一些清理工作來生成正確的HTML。 – 2013-05-13 13:54:11