【问题标题】:Unable to strip a stubborn space from a Ruby string (Nokogiri is involved)无法从 Ruby 字符串中去除顽固的空格(涉及 Nokogiri)
【发布时间】:2014-05-03 23:09:39
【问题描述】:

我正在使用 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"

我怎样才能完全去掉这个领先的空间?我怀疑是&amp;nbsp,但我无法摆脱它。

我保证我在现实生活中不会这么笨,但是这个问题让我很沮丧。真是无情。

谢谢!

【问题讨论】:

  • 您尝试过“字符串”.chomp 吗? (它摆脱了 \n\r),然后你可以剥离它。所以:“”.chomp.strip
  • Chomp 不起作用。前导空格仍然存在。
  • 你是怎么得到td的内容的?用text方法?
  • 不漂亮但你可以使用returned_value.strip[1..-1]
  • 好的,我现在明白了,感谢和抱歉造成的误解

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


【解决方案1】:

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

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 替换为' '(普通空格),则可以使用strip 删除空格,而无需将其删除到字符串中。

代码:

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

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

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

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

【讨论】:

  • “p txt”是否显示这些“不可见”字节?还是您以特殊方式打印它们(因为普通字符串不显示 unicode)?
  • 使用/\p{Space}/ 清理空白可能会更好,这应该会捕获所有空白。
  • @rogier 不,p xputs x.inspect 相同。通常我不在 irb 中工作,所以p 命令是我查看变量内部的快捷方式。
  • @knut muistooshort 告诉我写txt.gsub(/\p{Space}/, '')..我想。
  • 我确实收到了 Encoding::CompatiblityError。我会坚持你原来的解决方案,@knut。非常感谢大家的帮助!我确实尝试过检查 Nokogiri 返回的每个元素,答案就在那里。我只是看不到它。
猜你喜欢
  • 2012-12-17
  • 2012-04-05
  • 1970-01-01
  • 2013-05-09
  • 2012-07-15
  • 1970-01-01
  • 2012-09-01
  • 2010-12-07
相关资源
最近更新 更多