我正在使用scrapy从网站中提取数据。我正在使用MysqlDB将数据保存到mysql数据库。该脚本适用于英语网站,但当我在瑞典网站上试用时,我得到:
self.db.query(insertion_query)
exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 156:
ordinal not in range(128)
我已将以下行放在抓取过程中涉及的每个文件的顶部,以指示使用国际字符: # - - 编码:utf-8 - -
但我仍然收到错误。我还需要python接受非英语字符串吗?这是完整的堆栈跟踪:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\scrapy-0.14.3-py2.7-win32.egg\scrapy\middleware.py",
line 60, in _process_
chain
return process_chain(self.methods[methodname], obj, *args)
File "C:\Python27\lib\site-packages\scrapy-0.14.3-py2.7-win32.egg\scrapy\utils\defer.py",
line 65, in process_
chain
d.callback(input)
File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 368, in callback
self._startRunCallbacks(result)
File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 464, in
_startRunCallbacks
self._runCallbacks()
--- <exception caught here> ---
File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 551, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "C:\Python27\tco\tco\pipelines.py", line 64, in process_item
self.db.query(insertion_query)
exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 156:
ordinal not in range(128)
答案 0 :(得分:5)
这个unicode问题起初看起来很混乱,但实际上很容易。
# -- coding: utf-8 --
如果你在源代码之上写这个,那就意味着,python将会发生 将您的代码视为utf-8,而不是传入或传出的数据。
您显然想要将一些数据写入数据库,并且会发生此错误 当你的某些模块将你的utf-8字符串(我猜是瑞典语)编码为ascii时。
这意味着,要么将MySQL设置为ascii,要么将mysql数据库驱动程序设置为ascii。
所以我建议去检查你的mysql设置或驱动程序设置。
db = MySQLdb.connect(host=database_host ,user=user ,passwd=pass,db=database_name, charset = "utf8", use_unicode = True)
这将使您的mysql驱动程序使用utf8连接到mysql服务器
答案 1 :(得分:0)
This blog post包含提示:创建连接时(使用PooledDB
或MySQLdb.connect
),请指定选项charset = "utf8", use_unicode = True