无法从Ruby字符串中剥离顽固的空间(涉及Nokogiri)

时间:2014-03-25 20:48:18

标签: ruby-on-rails ruby html-parsing nokogiri

我正在使用Nokogiri来解析HTML文档。此问题所基于的源代码表示如下:

<td width='400' valign=top>
  <b><u>Jenny ID:</u>&nbsp;8675309</b><br />
        Name of Place<br />
        Street Address<br />
        City, State, Zip<br />
        Contact: Jenny Jenny<br />
        Phone: 867-5309<br />
        Fax: 
</td>

我正在使用几个分隔符来检索Jenny ID:Name of Place之间的文本。使用#strip,我无法删除前导空格。

 > returned_value.inspect
=> " 8675309\r\n                  "
 > returned_value.strip
=> " 8675309"

如果我使用测试字符串,#strip确实删除了前导和尾随空格。

 > test_string = " 11111 "
 > test_tring.strip
=> "11111"

我怎样才能彻底剥离这个领先的空间?我怀疑它是&nbsp,但我无法摆脱它。

我保证在现实生活中我不是那么愚蠢,但是这个问题让我失望了。这是无情的。

谢谢!

1 个答案:

答案 0 :(得分:4)

我试图像你一样得到同样的错误并创建了这个例子:

require 'nokogiri'

html = Nokogiri::HTML(<<-html
<td width='400' valign=top>
  <b><u>Jenny ID:</u>&nbsp;8675309</b><br />
        Name of Place<br />
        Street Address<br />
        City, State, Zip<br />
        Contact: Jenny Jenny<br />
        Phone: 867-5309<br />
        Fax: 
</td>
html
)

el = html.css('b').first
txt = el.content.split(':').last
puts txt    # ' 8675309'
p txt         #"\u00A08675309"
p txt.strip #"\u00A08675309"

前导字符不是空格,而是\u00A0(Unicode字符'NO-BREAK SPACE'(U + 00A0))。似乎strip没有删除它。

如果您明确删除不间断空格,您将获得所需的结果。如果将\u00A0替换为' '(正常空格),则可以删除带有空格的空格而不将其移除到字符串中。

代码:

p txt.gsub("\u00A0", ' ').strip   #-> "8675309"

您可以使用的替代品(感谢mu太短)

p txt.gsub(/\p{Space}/, ' ').strip

这需要UTF-8代码。没有你可能会得到一个Encoding :: CompatibilityError。