Я думаю, проблема в том, как ты смотришь на строку.Он будет выглядеть как пробел, но это не совсем то же самое:
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-кодировка сущностей, но это все еще неразрывный пробел.Я думаю, что преобразование Нокогири из кодировки сущностей является подходящим поведением при запросе строковой классификации.
Возможно, есть флаг, который указывает Нокогири НЕ декодировать значение, но я не знаю об этом.Вы можете проверить почтовый список Нокогири, который я упомянул в комментарии выше, чтобы увидеть, есть ли флаг.Я вижу преимущество для Нокогири в том, что , а не выполняет декодирование, поэтому, если такого флага нет, было бы неплохо время от времени.
Теперь все, что сказано, я думаю *Метод 1019 * ДОЛЖЕН возвращать значение в его сущностно-закодированное значение, поскольку неразрывный пробел - неприятная вещь в HTML-потоке.И , что Я думаю, вы должны упомянуть в списке рассылки или, может быть, даже как ошибку.Я думаю, что это неуместный результат.
http://groups.google.com/group/nokogiri-talk/msg/0b81ef0dc180dc74
Хорошо, теперь я могу объяснить поведение.По сути, проблема сводится к кодированию.
В Ruby 1.9 мы проверяем кодировку строки, которую вы передаете Нокогири.Если входной строкой является «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
объектно-закодированное значение.