2011-08-10 51 views
1

我想解析與Nokogiri的HTML頁面,但我有一些問題與文本。主要是,我無法擺脫不需要的字符。在解析時,當我獲得一個字符串時,我總是儘可能地清理它。我嘗試將不可打印的字符轉換爲獨特的空間。我用這個方法沒有成功很多修改後:紅寶石(1.8.7):如何擺脫不可打印的字符,而刮?

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

例如,supose這個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 

第一個似乎勉強OK,但我不知道如何解決的第二種情況。

+0

哪個引入nokogiri的版本您使用的? –

+0

機械化1.0.0和nokogiri 1.4.4 –

回答

1

將字符從一個字符集轉換爲另一個字符集的一種方法是使用Iconv。例如,如果你正在尋找只是UTF8轉換爲ASCII,你可以做這樣的事情是什麼:

require 'iconv' 

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

TRANSLIT開關告訴Iconv嘗試音譯(大致匹配)unconvertable字符。如果你不是要完全忽略unconvertable字符,那麼你可以使用IGNORE開關:

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

需要注意的是,如果它發現的東西就不能轉換Iconv將引發與TRANSLIT異常。對於您可以結合IGNORETRANSLIT像這樣:

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

有用的工具!非常感謝 –