UnicodeEncodeError на MySQL вставить в Python - PullRequest
1 голос
/ 14 ноября 2009

Я использовал lxml для анализа какой-либо веб-страницы, как показано ниже:

>>> doc = lxml.html.fromstring(htmldata)
>>> element in doc.cssselect(sometag)[0]
>>> text = element.text_content()
>>> print text
u'Waldenstr\xf6m'

Почему здесь печатается u'Waldenstr \ xf6m ', а не "Waldenström"?

После этого я попытался добавить этот текст в таблицу MySQL с набором символов UTF-8 и utf8_general_ci collatio. Users - модель Django:

>>> Users.objects.create(last_name=text)
'ascii' codec can't encode character u'\xf6' in position 9: ordinal not in range(128)

Что я тут не так делал? Как я могу получить правильные данные "Waldenström" и записать их в базу данных?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2009

Вы хотите text.encode('utf8')

0 голосов
/ 14 ноября 2009
>>> print text
u'Waldenstr\xf6m'

Существует разница между отображением чего-либо в оболочке (которая использует repr) и печатью (которая просто выплевывает строку):

>>> u'Waldenstr\xf6m'
u'Waldenstr\xf6m'

>>> print u'Waldenstr\xf6m'
Waldenström

Так что, я не уверен, что твой фрагмент выше действительно произошел. Если это так, то ваш XHTML должен содержать именно эту строку:

<div class="something">u'Waldenstr\xf6m'</div>

(возможно, он был неправильно сгенерирован Python, используя строку repr() вместо ее str()?)

Если это правильно и умышленно, вам нужно будет проанализировать этот строковый литерал Python в простую строку. Один из способов сделать это будет:

>>> r= r"u'Waldenstr\xf6m'"
>>> print r[2:-1].decode('unicode-escape')
Waldenström

Если фрагмент вверху на самом деле не совсем правильный, и вы просто спрашиваете, почему repr в Python экранирует все не-ASCII-символы, ответ заключается в том, что печать не-ASCII на консоль ненадежна в различных средах, так что безопаснее В приведенных выше примерах вы могли бы получить ? с или хуже вместо ö, если вам не повезло.

В Python 3 это меняется:

>>> 'Waldenstr\xf6m'
'Waldenström'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...