как заставить Нокогири не превращаться в космос - PullRequest
16 голосов
/ 18 декабря 2010

я получаю один html-фрагмент, такой как

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

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

"<li>市 场 价"

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

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

Ответы [ 2 ]

30 голосов
/ 22 декабря 2010

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

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

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

nbsp = Nokogiri::HTML("&nbsp;").text
html.gsub(nbsp, "&nbsp;")
11 голосов
/ 18 декабря 2010

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

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-кодировка сущностей, но это все еще неразрывный пробел.Я думаю, что преобразование Нокогири из кодировки сущностей является подходящим поведением при запросе строковой классификации.

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

Теперь все, что сказано, я думаю *Метод 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 &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 объектно-закодированное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...