2

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

2 回答 2

5

这个 unicode 问题起初看起来令人困惑,但实际上很容易。

# -- coding: utf-8 --

如果您在源代码之上编写此代码,则意味着 python 会将您的代码视为 utf-8,而不是传入或传出数据。

您显然想将一些数据写入您的数据库,当您的某些模块将您的 utf-8 字符串(我猜是瑞典语)编码为 ascii 时,就会发生此错误。

这意味着,要么 MySQL 被设置为 ascii,要么你的 mysql db 驱动程序被设置为 ascii。

所以我建议去检查你的mysql设置或驱动程序设置。

db = MySQLdb.connect(host=database_host ,user=user ,passwd=pass,db=database_name, charset = "utf8", use_unicode = True)

这将使您的 mysql 驱动程序使用 utf8 连接到 mysql 服务器

于 2012-05-14T08:37:24.637 回答
0

这篇博文包含一个提示:创建连接时(使用PooledDBMySQLdb.connect),指定选项charset = "utf8", use_unicode = True

于 2012-05-14T09:08:04.700 回答