2009-11-14 89 views
1

我用LXML解析某些網頁如下:爲什麼它打印u'Waldenstr \ xf6m」而不是‘瓦爾登斯特’這裏UnicodeEncodeError在MySQL插入在Python

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

在那之後,我想這個文本添加到一個MySQL表使用UTF-8字符集和utf8_general_ci collat​​io,用戶是一個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

你想text.encode('utf8')

+0

是的,我試過,但它也給了同樣的錯誤。 – jack 2009-11-14 00:55:51

+0

好吧,它現在有效。謝謝藝術。 – jack 2009-11-14 01:02:10

0
>>> 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 

如果在上面的代碼片段其實是不完全正確,你只是問爲什麼Python的repr逃避所有非ASCII字符,得到的答覆是,打印非ASCII到控制檯在各種環境下都不可靠,所以逃生更安全。在上面的例子中,如果你不走運,你可能收到?或更糟,而不是ö

在Python 3這改變:

>>> 'Waldenstr\xf6m' 
'Waldenström'