我无法从Nokogiri解析的字符串中删除空格



我不能从字符串中删除空白。

我的HTML是:

<p class='your-price'>
Cena pro Vás: <strong>139&nbsp;<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 &nbsp;,我会这样做:

require 'nokogiri'
doc = Nokogiri::HTML("&nbsp;")
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中提取实际编码字符"&nbsp;"之前对其进行预处理。这是简化的,但它适用于整个HTML文件,就像字符串中的单个实体一样:

s = "&nbsp;"
s.gsub('&nbsp;', ' ') # => " "

为目标使用固定字符串比使用正则表达式更快:

s = "&nbsp;" * 10000
require 'fruity'
compare do
  fixed { s.gsub('&nbsp;', ' ') }
  regex { s.gsub(/&nbsp;/, ' ') }
 end
# >> Running each test 4 times. Test will take about 1 second.
# >> fixed is faster than regex by 2x ± 0.1

如果你需要正则表达式的功能,它是很有用的,但是它们会大大降低代码的速度。

相关内容

  • 没有找到相关文章

最新更新