如何让Nokogiri不要转换为太空

时间:2010-12-18 01:16:18

标签: ruby nokogiri html-entities

我获取一个像

这样的html片段
"<li>市&nbsp;场&nbsp;价"

包含“&nbsp;”,但在调用Nokogiri NodeSet的to_s后,它变为

"<li>市 场 价"

,我想保留原始的html片段,并尝试为:save_with option方法设置to_s,但失败了。

有人会遇到同样的问题并给我帮助吗?提前谢谢你。

2 个答案:

答案 0 :(得分:30)

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

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

就我而言,我希望成为一个普通的空间。我认为在你的情况下,你希望他们返回“&amp; nbsp;”,所以你可以这样做:

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

答案 1 :(得分:11)

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

require 'nokogiri'

doc = Nokogiri::HTML('"<li>市&nbsp;场&nbsp;价"')
(doc % 'li').content.chars.to_a[1].ord # => 160
(doc % 'li').to_html # => "<li>市 场 价\"</li>"

常规空间为320x20' '160是非破坏空间的十进制值,这是使用Nokogiri的各种&nbsp;inner_textcontenttext之后to_s转换为的值to_html个标签。它不再是HTML实体编码,但它仍然是一个不间断的空间。我认为Nokogiri从实体编码的转换是在要求字符串化时的适当行为。

可能有一面旗帜告诉Nokogiri不要解码这个值,但是我并不知道它的副作用。你可以查看我在上面的评论中提到的Nokogiri的邮件列表,看看是否有一面旗帜。我可以看到Nokogiri的一个优点是进行解码也是如此,如果没有这样的标志,它偶尔会很好。

现在,所有这些,我认为 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 方法应该将值返回到它的实体编码值,因为不间断的空间是HTML流中遇到的令人讨厌的事情。 我认为你应该在邮件列表中提及,甚至可能是一个bug。我认为这是不恰当的结果。


http://groups.google.com/group/nokogiri-talk/msg/0b81ef0dc180dc74

  

好的,我现在可以解释一下这种行为。基本上,问题沸腾了   到编码。

     

在Ruby 1.9中,我们检查了你要提供的字符串的编码   引入nokogiri。如果输入字符串是“utf-8”,则假定文档为   是一个UTF-8文件。输出文档时,“”可以   表示为UTF-8字符,输出为UTF-8   字符。

     

在1.8中,由于我们无法检测文档的编码,我们假设   二进制编码并允许libxml2检测编码。   如果您将输入文档的编码设置为二进制,它将给出   你支持你想要的实体。以下是一些演示代码:

ASCII-8BIT
  

我也发布了YouTube视频! :-)

     

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

     

Aaron Patterson

您的示例文本不是inner_html,因此请尝试将该编码字符串更改为Unicode字符集名称,并查看{{1}}是否将返回实体编码的值。