Подтвердить что ты не робот

Как сделать Nokogiri не конвертировать в космос

i извлекает один html-фрагмент, например

"<li>市&nbsp;场&nbsp;价"

который содержит "&nbsp;", но после вызова to_s Nokogiri NodeSet он становится

"<li>市 场 价"

я хочу сохранить оригинальный html-фрагмент и попытался установить метод :save_with option для to_s, но не удалось.

может ли кто-то столкнуться с той же проблемой и помочь мне? заранее спасибо.

4b9b3361

Ответ 1

Я столкнулся с подобной ситуацией, и то, что я придумал, было немного взломанным, но, похоже, это хорошо работает.

nbsp = Nokogiri::HTML("&nbsp;").text
text.gsub(nbsp, " ")

В моем случае я хотел, чтобы nbsp было обычным пространством. Я думаю, что в вашем случае вы хотите, чтобы их вернули в "& nbsp;", чтобы вы могли сделать что-то вроде:

nbsp = Nokogiri::HTML("&nbsp;").text
html.gsub(nbsp, "&nbsp;")

Ответ 2

Я думаю, проблема в том, как вы смотрите на строку. Это будет выглядеть как пространство, но это не совсем то же самое:

require 'nokogiri'

doc = Nokogiri::HTML('"<li>市&nbsp;场&nbsp;价"')
(doc % 'li').content.chars.to_a[1].ord # => 160
(doc % 'li').to_html # => "<li>市 场 价\"</li>"

Правильное пространство 32, 0x20 или ' '. 160 - это десятичное значение для неразрывного пространства, которое преобразует &nbsp; после использования Nokogiri различных тегов inner_text, content, text или to_s. Это уже не кодирование сущности HTML, но оно по-прежнему остается неразрывным. Я думаю, что преобразование Нокогири из сущности-кодирования является подходящим поведением при запросе строкования.

Может быть флаг, чтобы сообщить Нокогири НЕ декодировать значение, но я не знаю об этом. Вы можете проверить почтовый список Nokogiri, о котором я упомянул в комментарии выше, чтобы узнать, есть ли флаг. Я вижу преимущество для Nokogiri, чтобы он не делал декодирование, поэтому, если нет такого флага, было бы неплохо иногда.

Теперь, все, что сказал, я думаю, что метод to_html СЛЕДУЕТ вернуть значение в его сущность-кодированное значение, поскольку неразрывное пространство - это неприятная вещь, с которой можно столкнуться в потоке HTML. И я думаю, вы должны упомянуть в списке писем или, возможно, даже в качестве ошибки. Я считаю, что это несоответствующий результат.


http://groups.google.com/group/nokogiri-talk/msg/0b81ef0dc180dc74

Хорошо, теперь я могу объяснить поведение. В основном проблема кипит вплоть до кодирования.

В Ruby 1.9 мы рассмотрим кодировку строки, которую вы кормите Nokogiri. Если входная строка "utf-8", предполагается, что документ быть документом UTF-8. Когда вы выводите документ, так как " " Можно быть представлен как символ UTF-8, он выводится как UTF-8 персонаж.

В 1.8, поскольку мы не можем обнаружить кодировку документа, мы предполагаем бинарное кодирование и разрешить libxml2 обнаруживать кодировку. Если вы установите кодировку входного документа в двоичную, это даст вы возвращаете объекты, которые хотите. Вот код для демонстрации:

 require 'nokogiri' 
 html = '<body>hello &nbsp; world</body>' 
 f    = Nokogiri.HTML(html) 
 node = f.css('body') 
 p node.inner_html 
 f    = Nokogiri.HTML(html.encode('ASCII-8BIT')) 
 node = f.css('body') 
 p node.inner_html 

Я также разместил видео с youtube!:-)

http://www.youtube.com/watch?v=X2SzhXAt7V4

Аарон Паттерсон

Твой образец текста не ASCII-8BIT, поэтому попробуйте изменить эту строку кодировки на имя набора символов Unicode и посмотрите, вернет ли значение inner_html значение, закодированное сущностью.