0

这是代码:

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]

两个='false'在哪里??

编辑

另外,有没有办法拒绝默认校正?(使用 to_xhtml 可以将 ='false' 但和 CDATA 保留到脚本标签中)

在我的选择中, to_xhtml 似乎更严格地工作,为什么 to_xhtml 保留 multiple='false' 代替?

编辑2

这是我的临时解决方法:gsub(/multiple=/, 'blahhhhh')解析前和gsub(/blahhhhh/, 'multiple=')解析后返回

4

1 回答 1

1

替换to_htmlto_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属性(和其他属性,如disabledor selected)不需要具有值,因此 Nokogiri 将其剥离以清理输出代码。

更新 2

为什么 to_xhtml 保留 multiple='false' 呢?

因为 XHTML 不允许省略属性的值,所以 Nokogiri 保留了它们。

我认为,你能做的最好的事情是首先为 Nokogiri 提供适当的 HTML 代码,即multiple完全省略属性而不是 write multiple="false"

于 2013-05-13T12:30:20.783 回答