__str__返回UnicodeEncodeError,但否则有效(u'\ xa0')

时间:2013-12-16 05:04:01

标签: python python-2.7 python-3.x unicode encoding

我正在经历我生命中最奇怪的错误。

我正在修复我的Hacker News API,而这一小段代码让我很头疼:

from hn import HN

hn = HN()


# print top stories from homepage
for story in hn.get_stories():
    print story.title
    print story

Story__str__方法如下:

def __str__(self):
    """
    Return string representation of a story
    """
    return self.title

(这与repo中的代码略有不同。我必须在这里调试很多。)

无论如何,输出是这样的:

Turn O(n^2) reverse into O(n)
Turn O(n^2) reverse into O(n)
My run-in with unauthorised Litecoin mining on AWS
My run-in with unauthorised Litecoin mining on AWS
Amazon takes away access to purchased Christmas movie during Christmas
Traceback (most recent call last):
  File "my_test_bot.py", line 11, in <module>
    print story
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 60: ordinal not in range(128)

我不知道为什么会失败。 __str__print story语句都打印出一个unicode。然后为什么后者不起作用?

另外,做print unicode(story)工作得很好(为什么??),但不幸的是我不能使用unicode(),因为它不兼容py3。

title编码为:title.encode('cp850', errors='replace').decode('cp850')

到底发生了什么事?如何确保我的API适用于它可以找到的任何(大多数)字符串,并且py2和py3兼容?

我有downloaded the page现在导致此错误进行离线调试。

2 个答案:

答案 0 :(得分:2)

__str__返回一个字节数组,没有任何关于编码的信息,您的控制台应用程序可能会尝试将__str__返回的任何内容编码为ascii并且失败。您可以尝试使用返回字符的__unicode__this answer中有更多信息。

是的,py3只有__str__元内容,所以你必须保持__unicode__兼容性

答案 1 :(得分:0)

当您尝试将输出保存到文件而不是打印时,通常可以解释这种令人讨厌的问题。尝试:

for story in hn.get_stories():
    print type(story.title)
    print type(story)

    with open('content.txt', 'ab') as f:
        f.write(story.title)
        f.write('\n\n')
        f.write(story)
        f.write('\n-----------------------------------------------\n')

我希望这是解决方案的迭代方法。需要更多的事实。你可能会被某些东西误导。