2016-03-08 43 views
0

我有一個解析網頁然後將數據寫入其他地方的程序。當我寫數據時,我得到了當從網頁輸出解析數據時出現Python UnicodeEncodeError

"UnicodeEncodeError: 'ascii' codec can't encode characters in position 19-21: ordinal not in range(128)"

我正在使用lxml收集數據。

name = apiTree.xpath("//boardgames/boardgame/name[@primary='true']")[0].text 
worksheet.goog["Name"].append(name) 

在閱讀,http://effbot.org/pyfaq/what-does-unicodeerror-ascii-decoding-encoding-error-ordinal-not-in-range-128-mean.htm,它表明我記錄所有我的變量中的Unicode。這意味着我需要知道該網站正在使用什麼編碼。

我的實際數據出來某處寫到最後一行是:

wks.update_cell(row + 1, worksheet.goog[value + "_col"], (str(worksheet.goog[value][row])).encode('ascii', 'ignore')) 

如何將納入使用Unicode假設編碼是在和我想這是在路上ASCII方式UTF-8出來嗎?

回答

0

我想我可能已經想出了我自己的問題。

apiTree.xpath("//boardgames/boardgame/name[@primary='true']")[0].text 

實際上默認爲unicode。所以我所做的就是改變這一行:

name = (apiTree.xpath("//boardgames/boardgame/name[@primary='true']")[0].text).encode('ascii', errors='ignore') 

我只是輸出而無需改變任何東西:

wks.update_cell(row + 1, worksheet.goog[value + "_col"], worksheet.goog[value][row]) 

由於數據的性質,僅ASCII主要是罰款。雖然,我可能可以使用UTF-8並捕獲一些額外的字符......但這與問題無關。

:)

+0

你爲什麼要首先編碼爲ascii? –

+0

這只是英文遊戲的名稱。我不需要比Ascii更多的東西......但我想我可以使用UTF-8。 – Aro

1

你的錯誤是因爲:

str(worksheet.goog[value][row]) 

打電話給你試圖編碼ASCII str,你應該做的是編碼設置爲UTF-8:

worksheet.goog[value][row].encode("utf-8") 

只要如何使用unicode進行合併,假設編碼爲UTF-8,並且我希望它在出路上是ASCII碼?去,你不能沒有ascii拉丁ă等等,除非你想要使用像Unidecode類似的最接近的ascii等效。