瑞典字符的Python编码

时间:2012-05-14 08:12:19

标签: python encoding utf-8 mysql-python

我正在使用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) 

2 个答案:

答案 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包含提示:创建连接时(使用PooledDBMySQLdb.connect),请指定选项charset = "utf8", use_unicode = True