2012-05-14 4 views
2

Я использую scrapy для извлечения данных с веб-сайта. Я сохраняю данные в базе данных mysql с помощью MysqlDB. Скрипт работает на английских сайты, но когда я пытаюсь его на шведском сайте я получаю:Кодирование Python для шведских символов

self.db.query(insertion_query) 
exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 156:  
ordinal not in range(128) 

Я поставил следующую строку в верхней части каждого файла, участвующем в процессе очищающего указать использование международного charachters : # - - кодировка: 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

делать себе и действительно прочитайте это: http://docs.python.org/howto/unicode.html - это только сэкономит ваше время. – WeaselFox

+1

Какую оболочку базы данных вы используете? – BluePeppers

+0

Пожалуйста, добавьте трассировку стека к вопросу. –

ответ

5

Эта проблема с юникодом выглядит сначала путаной, но на самом деле это довольно просто.

# -- coding: utf-8 -- 

Если вы пишете это на верхней части исходного кода, это означает, что питон будет относиться код, как UTF-8, но не входящие или исходящие данные.

Очевидно, что вы хотите записать некоторые данные в вашу базу данных, и эта ошибка возникает , когда некоторые из ваших модулей, кодирующих вашу строку utf-8 (которая, как я полагаю, swedish), относятся к 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 подключиться к серверу MySQL, используя utf8

+0

Спасибо! Очень поучительно! Я проверю это немедленно! – user1009453

+0

db = MySQLdb.connect (host = database_host, user = user, passwd = pass, db = имя_базы, charset = "utf8", use_unicode = True) Это поможет вам подключить ваш драйвер mysql с помощью utf8, но вам все равно придется установите ваш сервер mysql с помощью utf8 –

+0

Хорошо, просто попробовал это, но я получаю: TypeError: 'use_unicode' является недопустимым аргументом ключевого слова для этой функции. Код моей вставки: import _mysql self.db = _mysql.connect (host = "host", user = "user_name", 10 passwd = "pass", db = "test_db", charset = "utf8", use_unicode = True) – user1009453

0

This blog post содержит подсказку: При создании соединения (либо с помощью PooledDB или MySQLdb.connect), указать опции charset = "utf8", use_unicode = True

Смежные вопросы