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复制粘贴)

<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) # => ["302240", "o", "r", "d", "i", "n", "303240", "r", "i", "a", " "]

我不知道为什么strip不去掉第一个空格。此外,应用clear_string后的解析结果,使用YAML::dump转储到一个yaml文件中。对于两个文本,其内容分别为:

"TramitacixC3xB3:"
!binary |
  wqBvcmRpbsOgcmlh

第一个似乎勉强可以,但我不知道如何解决第二个情况

将字符从一个字符集转换为另一个字符集的一种方法是使用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"

相关内容

  • 没有找到相关文章

最新更新