如何让Nokogiri不要转换  到太空

ywe*_*nbo 16 ruby html-entities nokogiri

我拿一个像html一样的html片段

"<li>?&nbsp;?&nbsp;?"
Run Code Online (Sandbox Code Playgroud)

它包含" &nbsp;",但在调用to_sNokogiri NodeSet之后,它变成了

"<li>? ? ?"
Run Code Online (Sandbox Code Playgroud)

,我想保持原有的HTML片段,并试图设置:save_with optionto_s方法,但未能成功.

有人会遇到同样的问题并给我帮助吗?先感谢您.

Mik*_*rer 30

我遇到了类似的情况,我提出的是一个黑客,但它似乎运作良好.

nbsp = Nokogiri::HTML("&nbsp;").text
text.gsub(nbsp, " ")
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我希望成为一个常规空间.我认为在您的情况下,您希望将它们返回到" ",因此您可以执行以下操作:

nbsp = Nokogiri::HTML("&nbsp;").text
html.gsub(nbsp, "&nbsp;")
Run Code Online (Sandbox Code Playgroud)

  • 这不是通用解决方案,如果您希望它保留所有html实体,该怎么办?喜欢&mdash; &QUOT; 等等 (2认同)
  • 如果你不喜欢运行多余的Nokogiri :: HTML("&nbsp;").text`,你可以使用`nbsp = 160.chr(Encoding :: UTF_8)`来获取gsub的模式.160是不间断空间的扩展ASCII码; 这是Nokogiri在分析'&nbsp'时返回的内容. (2认同)

the*_*Man 11

我认为问题是你如何看待字符串.它看起来像一个空间,但它并不完全相同:

require 'nokogiri'

doc = Nokogiri::HTML('"<li>?&nbsp;?&nbsp;?"')
(doc % 'li').content.chars.to_a[1].ord # => 160
(doc % 'li').to_html # => "<li>? ? ?\"</li>"
Run Code Online (Sandbox Code Playgroud)

常规空间是32,0x20' '.160是一种非破空间,这是十进制值&nbsp;转换为使用引入nokogiri的各种后inner_text,content,textto_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 &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 
Run Code Online (Sandbox Code Playgroud)

我也发布了一个youtube视频!:-)

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

亚伦帕特森

您的示例文本不是ASCII-8BIT这样尝试将该编码字符串更改为Unicode字符集名称,并查看是否inner_html将返回实体编码的值.