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

时间:2011-08-10 12:11:04

标签: ruby utf-8 nokogiri

我正在尝试使用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复制粘贴)

<tr>
    <td><span class="linkred2">Tramitaci&oacute;:</span></td>
    <td>&nbsp;ordinària </td>
</tr>

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

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

1 个答案:

答案 0 :(得分:1)

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

require 'iconv'

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

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

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

请注意Iconv如果发现无法转换的内容,则会向TRANSLIT引发异常。为此,您可以将IGNORETRANSLIT组合在一起:

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