ruby(1.8.7):如何在刮擦时摆脱不可打印的字符?

我正在尝试使用Nokogiri解析HTML页面,但我遇到了一些文本问题。 主要是,我无法摆脱不必要的角色。 在解析时,当我获得String时,我总是尝试尽可能地清理它。 我尝试将非打印字符转换为唯一空格。 经过大量修改后,我使用这种方法没有成功:

def clear_string(str) CGI::unescapeHTML(str).gsub(/\s+/mu," ").strip end 

例如,设置这个HTML片段(从http://www.gisa.cat/gisa/servlet/HomeLicitation?licitationID=1061525复制粘贴)

  Tramitació:  ordinària   

Netbeans 7.0使用Nokogiri和clear_string (上面定义的方法)显示了一些中间示例输出

 row.at("td[1]").text # => "Tramitació:" row.at("td[2]").text # => " ordinària " clear_string(row.at("td[2]").text) # => " ordinària" row.at("td[2]").text.scan(/./mu) # => ["\302\240", "o", "r", "d", "i", "n", "\303\240", "r", "i", "a", " "] 

我不知道为什么strip不会摆脱第一个空间。 此外,应用clear_string后的解析结果将使用YAML::dump转储到yaml文件中。 其内容分别为两种文本:

 "Tramitaci\xC3\xB3:" !binary | wqBvcmRpbsOgcmlh 

第一个似乎不太好,但我不知道如何解决第二种情况。

将字符从一个字符集转换为另一个字符集的一种方法是使用Iconv 。 例如,如果您要查找的只是将UTF8转换为ASCII,您可以执行以下操作:

 require 'iconv' s = "ordinària" Iconv.conv('ASCII//TRANSLIT', 'UTF8', s) => "ordinaria" 

TRANSLIT开关告诉Iconv尝试和音译(近似匹配) TRANSLIT转换的字符。 如果您想要完全忽略不可转换的字符,那么您可以使用IGNORE开关:

 Iconv.conv('ASCII//IGNORE', 'UTF8', s) => "ordinria" 

请注意,如果找到无法转换的内容, Iconv将使用TRANSLIT抛出exception。 为此你可以像这样组合IGNORETRANSLIT

 Iconv.conv('ASCII//TRANSLIT//IGNORE', 'UTF8', s) => "ordinaria"