我正在使用Nokogiri来解析HTML页面,但我遇到了非破坏空间的奇怪问题。我尝试了不同的编码,替换了空白,以及其他一些令人头疼的尝试。
以下是有问题的HTML代码段:
<td>Amount 15,300 at dollars</td>
请注意我使用Nokogiri后
表示的更改:
<td>Amount 15,300 at dollars</td>
输出inner_text
:
Amount 15,300 at dollars
这是我的基础Nokogiri抓取,我确实尝试了一些替代方案来解决但是失败了:
doc = Nokogiri::HTML(open(url))
然后我为相关项目执行了doc.search
。
请注意,如果我查看该文档,该行会在该行显示 
。
inner_text
符号,我无法显示Â
。
答案 0 :(得分:2)
我知道这已经过时了,但我花了一个小时才找到解决这个问题的方法,一旦你知道就很容易了。只需将您的字符串传递给此函数,它就会被“删除”。
def strip_html(str)
nbsp = Nokogiri::HTML(" ").text
str.gsub(nbsp,'')
end
如果您愿意,也可以用空格替换它。愿你们许多人找到这个答案!
答案 1 :(得分:1)
除非你真的,真的想保留
符号,否则这里应该没有问题。
A0
是非中断空格的十六进制字符代码。因此, 
打印一个不间断的空格,完全等同于
。  
也会做同样的事情。
Nokogiri在这里做的是读取文本节点,识别实体,并在内部将它们转换为实际的字符串表示。然后,当将其转换回HTML友好版本的文本节点时,它通过其十六进制代码表示不间断空格,而不是在实体表中查找它的性能开销,因为它无论如何都是等价的。
假设Â
正是您所看到的并且不仅仅是粘贴到StackOverflow的问题,这是一个文本编码问题:输出软件(浏览器?)不是UTF-8模式,所以不知道如何处理字符代码A0
,它也是最好的。如果这是一个浏览器,将<meta charset="utf-8">
添加到头部将解决此问题,并使输出的其余部分更加符合Unicode。
如果您确实想要
,请使用gsub
在最终输出中替换它们。否则,不要担心。
答案 2 :(得分:0)
正如@sawa所说,主要问题是你在写入控制台时看到的内容。在Nokogiri将其转换为适当的二进制值后,它无法正确显示非中断空格。
解决问题的常用方法是预处理内容:
require 'nokogiri'
html = '<td>Amount 15,300 at dollars</td>'
doc = Nokogiri::HTML::DocumentFragment.parse(html.gsub(/&(?:#xa0|#160|nbsp);/i, ' '))
puts doc.to_html
哪个输出:
<td>Amount 15,300 at dollars</td>