我试图用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ó:</span></td>
<td> 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
抛出异常。为此,您可以将IGNORE
和TRANSLIT
组合在一起,如下所示:
Iconv.conv('ASCII//TRANSLIT//IGNORE', 'UTF8', s)
=> "ordinaria"