2

私はスクレイピーを使用して Web サイトからデータを抽出しています。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として設定されているか、mysqldbドライバーが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

このブログ投稿にはヒントが含まれています: 接続を作成するとき ( または を使用PooledDB) MySQLdb.connect、オプションを指定しますcharset = "utf8", use_unicode = True

于 2012-05-14T09:08:04.700 に答える