年代久遠,記憶模糊,有錯請指正
簡單來說,IDLE 是個非常鳥的東西
沒事別亂用,有事也不建議用 XD
當初也被這問題搞得很痛苦,後來發現根本不是我的錯
以下為推測
你的問題出自於 IDLE 的架構
IDLE 的架構估計是這樣的
程式一負責輸入和輸出,程式二負責計算,兩者間用 socket 連接
這樣做有個好處,就是能夠處理 KeyboardInterrupt
你可以在 IDLE 試試看
while True:
pass
然後狂按 Ctrl-C,應該可以正常跳出,胡亂按 Enter 鍵也能換行
如果是在 PythonWin,程式就當在那裏(實際上在執行無限迴圈),不管你按啥都沒反應
這就是有沒有把程式分成兩部分的差別
除此之外因為使用 socket 通訊,速度奇慢
但你的問題也就因此產生
輸入 u'中文',正常 python 會看到 u'\u4e2d\u6587'
但在 IDLE 會看到 u'\xa4\xa4\xa4\xe5'
這大概是因為,在 IDLE 裡面是這樣搞的
程式一收到 "u'中文'",把這字串丟給程式二執行
程式二執行 eval("u'中文'"),結果就是 u'\xa4\xa4\xa4\xe5'
把這結果丟回程式一,輸出自然還是 u'\xa4\xa4\xa4\xe5'
如果堅持要用 IDLE 的話,記得輸入永遠不能使用 unicode
錯誤輸入如下
>>> s = u'中文'
>>> s
u'\xa4\xa4\xa4\xe5'
>>> print(s)
¤¤¤å
正確(?)輸入如下(跟 console encoding 有關)
>>> s = '中文'.decode('big5')
>>> s
u'\u4e2d\u6587'
>>> print(s)
中文
理論上,這問題只會出現在使用者輸入上
像是讀檔之類的,應該也許大概可能不會出問題
但是要不小心搞出問題也不是不可能
BeautifulSoup 我不熟,不清楚是你程式寫錯了還是這問題真的發生了
總而言之,珍惜生命,遠離 IDLE
或是你要裝 Python 3 也可以啦,Python 3 的 IDLE 應該不會有這問題了