什麼是真正發生在這裏是一對夫婦由服務器發起的重定向時,acual錯誤之前:
- 請求:
http://yinwang.org/blog-cn/2013/04/21/ydiff-%E7%BB%93%E6%9E%84%E5%8C%96%E7%9A%84%E7%A8%8B%E5%BA%8F%E6%AF%94%E8%BE%83
- 響應:重定向到
http://www.yinwang.org/blog-cn/2013/04/21/ydiff-%E7%BB%93%E6%9E%84%E5%8C%96%E7%9A%84%E7%A8%8B%E5%BA%8F%E6%AF%94%E8%BE%83
- 請求:
http://www.yinwang.org/blog-cn/2013/04/21/ydiff-%E7%BB%93%E6%9E%84%E5%8C%96%E7%9A%84%E7%A8%8B%E5%BA%8F%E6%AF%94%E8%BE%83
- 響應:重定向到(準確地說實際上是
'http://www.yinwang.org/blog-cn/2013/04/21/ydiff-\xe7\xbb\x93\xe6\x9e\x84\xe5\x8c\x96\xe7\x9a\x84\xe7\xa8\x8b\xe5\xba\x8f\xe6\xaf\x94\xe8\xbe\x83/'
)
AFAIK,上次重定向無效。地址應該是純ASCII(非ASCII字符應該被編碼)。正確的編碼地址應該是:http://www.yinwang.org/blog-cn/2013/04/21/ydiff-%E7%BB%93%E6%9E%84%E5%8C%96%E7%9A%84%E7%A8%8B%E5%BA%8F%E6%AF%94%E8%BE%83/
現在看來,urllib在播放最好的地址之前播放的很好,自己做了轉換,而urllib2只是使用它接收的地址。
你可以看到,如果你試圖打開手動最終地址:
的urllib
>>> print urllib.urlopen('http://www.yinwang.org/blog-cn/2013/04/21/ydiff-\xe7\xbb\x93\xe6\x9e\x84\xe5\x8c\x96\xe7\x9a\x84\xe7\xa8\x8b\xe5\xba\x8f\xe6\xaf\x94\x
e8\xbe\x83/').geturl()
http://www.yinwang.org/blog-cn/2013/04/21/ydiff-%E7%BB%93%E6%9E%84%E5%8C%96%E7%9A%84%E7%A8%8B%E5%BA%8F%E6%AF%94%E8%BE%83/
的urllib2
>>> try:
... urllib2.urlopen('http://www.yinwang.org/blog-cn/2013/04/21/ydiff-\xe7\xbb\x93\xe6\x9e\x84\xe5\x8c\x96\xe7\x9a\x84\xe7\xa8\x8b\xe5\xba\x8f\xe6\xaf\x94\xe8\xbe\x83/')
... except Exception as e:
... print e.geturl()
...
http://www.yinwang.org/blog-cn/2013/04/21/ydiff-š╗ôŠ×äňîľšÜäšĘőň║ĆŠ»öŔżâ/
解決方案
如果是你的服務器,你應該修復那裏的問題。否則,我想應該可以編寫一個urllib2.HTTPRedirectHandler,它將在urllib2中對重定向URL進行編碼。
這兩個鏈接是兩個不同的東西,它們不代表相同的資源。 –
我懷疑urllib會自動添加'/'。差異必須在服務器端。某些服務器被配置爲將這些URL視爲平等,有些則不是。 – zvone
@BurhanKhalid是的,你說的對,我知道,我懷疑是中文網址和沒有中文的網址到'urllib2.urlopen'的區別。我不知道我是否意味着我想表達的意思...... – DsttanE