2013-12-16 45 views
3

我正在經歷我生命中最奇怪的錯誤。__str__返回UnicodeEncodeError,但其他作品(u' xa0')

我修我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 

(這是從一點點不同代碼在回購。我不得不在這裏調試。)

反正,輸出是這樣的:

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

你應該使用'str.encode'和'str.decode'方法。要麼你只使用字節數組(py2樣式),我不推薦使用unicode字符串(使用'str.encode'或'print(u「Hello」)')。順便說一句,如果你想要兼容py2和py3,請使用print作爲函數而不是關鍵字。目前,您的問題是您嘗試使用ascii編碼解碼器解碼unicode字符串,而這將永遠不會工作。Ever::P – Depado

回答

2

__str__返回一個字節數組,但沒有任何關於編碼的信息,您的控制檯應用程序可能會嘗試對由__str__返回的任何內容進行編碼,並將其編譯爲ascii並且失敗。您可以嘗試使用返回字符的__unicode__。有更多的信息在this answer

是的,PY 3只__str__元的東西,所以你必須保持__unicode__兼容性

+1

這不會解釋爲什麼'print story.title'顯然可以工作,但'print story'不能,因爲根據他的代碼他們應該有相同的結果。 – BrenBarn

+1

@BrenBam,不一定:'print story.title'隱式計算'str(story .title)'並打印結果,但'print story'隱式計算'str(story)',它是'story .__ str __()'返回'story.title'。內建的'str()'是* not *應用於後一種情況下的'story.title',只適用於前一種情況。 –

+0

不是真的,這並沒有真正起作用。'return'[{0}]: {2}'的「{1}」。'__unicode__'中的格式(self.points,self.title,self.submitter)'仍然會導致錯誤。 –

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') 

我希望這是迭代方法的解決方案。需要更多的事實。你可能會被某些東西誤導。

相關問題