我获取一个像
这样的html片段"<li>市 场 价"
包含“
”,但在调用Nokogiri NodeSet的to_s
后,它变为
"<li>市 场 价"
,我想保留原始的html片段,并尝试为:save_with option
方法设置to_s
,但失败了。
有人会遇到同样的问题并给我帮助吗?提前谢谢你。
答案 0 :(得分:30)
我遇到了类似的情况,我提出的是一个黑客攻击,但似乎运作良好。
nbsp = Nokogiri::HTML(" ").text
text.gsub(nbsp, " ")
就我而言,我希望成为一个普通的空间。我认为在你的情况下,你希望他们返回“&amp; nbsp;”,所以你可以这样做:
nbsp = Nokogiri::HTML(" ").text
html.gsub(nbsp, " ")
答案 1 :(得分:11)
我认为问题在于你是如何看待字符串的。它看起来像一个空间,但它并不完全相同:
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
转换为的值to_html
个标签。它不再是HTML实体编码,但它仍然是一个不间断的空间。我认为Nokogiri从实体编码的转换是在要求字符串化时的适当行为。
可能有一面旗帜告诉Nokogiri不要解码这个值,但是我并不知道它的副作用。你可以查看我在上面的评论中提到的Nokogiri的邮件列表,看看是否有一面旗帜。我可以看到Nokogiri的一个优点是不进行解码也是如此,如果没有这样的标志,它偶尔会很好。
现在,所有这些,我认为 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
方法应该将值返回到它的实体编码值,因为不间断的空间是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}}是否将返回实体编码的值。