我不能从字符串中删除空白。
我的HTML是:
<p class='your-price'>
Cena pro Vás: <strong>139 <small>Kč</small></strong>
</p>
我的代码是:
#encoding: utf-8
require 'rubygems'
require 'mechanize'
agent = Mechanize.new
site = agent.get("http://www.astratex.cz/podlozky-pod-raminka/doplnky")
price = site.search("//p[@class='your-price']/strong/text()")
val = price.first.text => "139 "
val.strip => "139 "
val.gsub(" ", "") => "139 "
gsub
, strip
等不起作用。为什么?我该如何解决这个问题?
val.class => String
val.dump => ""139\u{a0}"" !
val.encoding => #<Encoding:UTF-8>
__ENCODING__ => #<Encoding:UTF-8>
Encoding.default_external => #<Encoding:UTF-8>
我使用Ruby 1.9.3,所以Unicode应该不是问题。
strip
仅删除ASCII空白,您在这里得到的字符是Unicode非分隔空间。
删除字符很容易。您可以通过提供带有字符代码的正则表达式来使用gsub
:
gsub(/u00a0/, '')
也可以调用
gsub(/[[:space:]]/, '')
删除所有Unicode空白。有关详细信息,请查看Regexp文档。
如果我想删除非换行空格"u00A0"
AKA
,我会这样做:
require 'nokogiri'
doc = Nokogiri::HTML(" ")
s = doc.text # => " "
# s is the NBSP
s.ord.to_s(16) # => "a0"
# and here's the translate changing the NBSP to a SPACE
s.tr("u00A0", ' ').ord.to_s(16) # => "20"
所以tr("u00A0", ' ')
能帮你找到你想要的位置此时NBSP变成了空格
tr
是非常快速和容易使用。
另一种方法是在从HTML中提取实际编码字符"
"之前对其进行预处理。这是简化的,但它适用于整个HTML文件,就像字符串中的单个实体一样:
s = " "
s.gsub(' ', ' ') # => " "
为目标使用固定字符串比使用正则表达式更快:
s = " " * 10000
require 'fruity'
compare do
fixed { s.gsub(' ', ' ') }
regex { s.gsub(/ /, ' ') }
end
# >> Running each test 4 times. Test will take about 1 second.
# >> fixed is faster than regex by 2x ± 0.1
如果你需要正则表达式的功能,它是很有用的,但是它们会大大降低代码的速度。