2013-05-13 2 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] 

Где 'ложь' два = ??

EDIT

PLus, есть способ, чтобы выключить коррекцию по умолчанию ?? (используйте to_xhtml, чтобы сохранить значение = 'false', но и CDATA в теге скрипта)

В моем варианте to_xhtml кажется более строгим, почему to_xhtml сохраняет multiple = 'false' вместо?

EDIT2

Вот мой временный обходной путь: GSUB (/ множественным = /, 'blahhhhh') перед разбором и GSUB (/ blahhhhh /, 'множественным =') назад после разбора

+0

'Где находятся два« ложных »? Существует только один '' false ''и один' 'true'' –

ответ

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> 

Update Это происходит потому, что в HTML атрибут multiple (и другие атрибуты, такие disabled или selected) не требует, чтобы иметь значение, так Nokogiri раздевает его для очистки вывода выходного кода.

Update 2

почему to_xhtml держать вместо кратные = 'ложь'?

Поскольку XHTML не позволяет опустить значение атрибутов, то Nokogiri сохраняет их.

Самое лучшее, что вы можете сделать, я думаю, это накопить Nokogiri с правильным кодом HTML, в первую очередь, то есть полностью опустить атрибут multiple вместо записи multiple="false".

+0

. Я также проверил, что to_xhtml работает, но xhtml создает больше проблем с HTML5, все еще отлаживая – rhapsodyn

+1

@rhapsodyn. Если вы используете HTML5, имейте в виду, что 'multiple' , 'multiple =" true "и' multiple = "false" 'все эквивалентны. – toro2k

+0

«Браузеры игнорируют значение таких атрибутов». Nokogiri - это не браузер, это синтаксический анализатор, и у него есть хорошее представление о том, что спецификация HTML говорит о том, что разметка должна выглядеть, поэтому она не отображает «=» false "' или '=" true "', когда вы запрашиваете вывод HTML, используя 'to_html'. Он выполняет некоторую очистку для создания надлежащего HTML. –

Смежные вопросы