ywe*_*nbo 16 ruby html-entities nokogiri
我拿一个像html一样的html片段
"<li>? ? ?"
Run Code Online (Sandbox Code Playgroud)
它包含" ",但在调用to_sNokogiri NodeSet之后,它变成了
"<li>? ? ?"
Run Code Online (Sandbox Code Playgroud)
,我想保持原有的HTML片段,并试图设置:save_with option的to_s方法,但未能成功.
有人会遇到同样的问题并给我帮助吗?先感谢您.
Mik*_*rer 30
我遇到了类似的情况,我提出的是一个黑客,但它似乎运作良好.
nbsp = Nokogiri::HTML(" ").text
text.gsub(nbsp, " ")
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我希望成为一个常规空间.我认为在您的情况下,您希望将它们返回到" ",因此您可以执行以下操作:
nbsp = Nokogiri::HTML(" ").text
html.gsub(nbsp, " ")
Run Code Online (Sandbox Code Playgroud)
the*_*Man 11
我认为问题是你如何看待字符串.它看起来像一个空间,但它并不完全相同:
require 'nokogiri'
doc = Nokogiri::HTML('"<li>? ? ?"')
(doc % 'li').content.chars.to_a[1].ord # => 160
(doc % 'li').to_html # => "<li>? ? ?\"</li>"
Run Code Online (Sandbox Code Playgroud)
常规空间是32,0x20或' '.160是一种非破空间,这是十进制值 转换为使用引入nokogiri的各种后inner_text,content,text或to_s标签.它不再是HTML实体编码,但它仍然是一个不间断的空间.我认为Nokogiri从实体编码的转换是在要求字符串化时的适当行为.
可能有一个标志告诉Nokogiri不解码该值,但我不知道它是否在手边.你可以查看我在上面的评论中提到的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
Run Code Online (Sandbox Code Playgroud)
我也发布了一个youtube视频!:-)
http://www.youtube.com/watch?v=X2SzhXAt7V4
亚伦帕特森
您的示例文本不是ASCII-8BIT这样尝试将该编码字符串更改为Unicode字符集名称,并查看是否inner_html将返回实体编码的值.