2015-12-06 36 views
1

例子:urllib2.urlopen不添加 「/」 最後的URL與中國自動

URL_1 = 「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/

url_2 = 「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

正如你看到的,如果我不在網址的最後加上/,當我使用urllib2.urlopen(url_2)時,它返回400錯誤,因爲有效的URL應該是url_1,如果URL不包含任何中文,那麼urllib2.urlopenurllib.urlopen會自動添加/

問題是urllib.urlopen很適合所有這些情況,但urllib2.urlopen只有當網址沒有中文時效果很好。

所以我想知道如果它是一個小錯誤urllib2.urlopen,或者是否有另一種解釋呢?

+0

這兩個鏈接是兩個不同的東西,它們不代表相同的資源。 –

+0

我懷疑urllib會自動添加'/'。差異必須在服務器端。某些服務器被配置爲將這些URL視爲平等,有些則不是。 – zvone

+0

@BurhanKhalid是的,你說的對,我知道,我懷疑是中文網址和沒有中文的網址到'urllib2.urlopen'的區別。我不知道我是否意味着我想表達的意思...... – DsttanE

回答

0

什麼是真正發生在這裏是一對夫婦由服務器發起的重定向時,acual錯誤之前:

  1. 請求: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
  2. 響應:重定向到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
  3. 請求: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
  4. 響應:重定向到​​(準確地說實際上是'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進行編碼。

+0

我注意到的一件事是'urllib'使用HTTP 1.0和'urllib2' HTTP 1.1。 – Koterpillar

+1

非常感謝!是的,我想你明白了,我測試了一下,發現問題在於'urllib2.urlopen'實際使用的'URL'通過添加一個'/'來重定向,並且它改變爲一個str(「 http://www.yinwang.org/blog-cn/2013/04/21/ydiff-結構化的程序比較/「),它的編碼方式是'UTF-8',事實上'urllib.urlopen'運行良好但'urllib2.urlopen'沒有,所以你建議的解決方案是正確的,還有另一種解決方案,使用'eff_url = urllib.quote(e.geturl(),safe =「:/」)'then'urllib2 .urlopen(eff_url)'會起作用。無論如何,這是一個「編碼」問題... – DsttanE

相關問題