我正在经历我生命中最奇怪的错误。
我正在修复我的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现在导致此错误进行离线调试。
答案 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')
我希望这是解决方案的迭代方法。需要更多的事实。你可能会被某些东西误导。