Как сделать Nokogiri не конвертировать в космос
i извлекает один html-фрагмент, например
"<li>市 场 价"
который содержит "
", но после вызова to_s
Nokogiri NodeSet он становится
"<li>市 场 价"
я хочу сохранить оригинальный html-фрагмент и попытался установить метод :save_with option
для to_s
, но не удалось.
может ли кто-то столкнуться с той же проблемой и помочь мне? заранее спасибо.
Ответы
Ответ 1
Я столкнулся с подобной ситуацией, и то, что я придумал, было немного взломанным, но, похоже, это хорошо работает.
nbsp = Nokogiri::HTML(" ").text
text.gsub(nbsp, " ")
В моем случае я хотел, чтобы nbsp было обычным пространством. Я думаю, что в вашем случае вы хотите, чтобы их вернули в "& nbsp;", чтобы вы могли сделать что-то вроде:
nbsp = Nokogiri::HTML(" ").text
html.gsub(nbsp, " ")
Ответ 2
Я думаю, проблема в том, как вы смотрите на строку. Это будет выглядеть как пространство, но это не совсем то же самое:
require 'nokogiri'
doc = Nokogiri::HTML('"<li>市 场 价"')
(doc % 'li').content.chars.to_a[1].ord # => 160
(doc % 'li').to_html # => "<li>市 场 价\"</li>"
Правильное пространство 32
, 0x20
или ' '
. 160
- это десятичное значение для неразрывного пространства, которое преобразует
после использования 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 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
значение, закодированное сущностью.