2016-03-08 40 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等效。