urllib2.urlopen不添加" /"自动中文的最后一个网址

时间:2015-12-06 05:02:28

标签: python urllib2 urllib

示例:

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错误,因为有效网址应为{{1} },如果网址不包含任何中文,url_1urllib2.urlopen会自动添加urllib.urlopen

问题是/适用于所有这些情况,但urllib.urlopen只适用于没有中文的网址。

所以我想知道如果它是urllib2.urlopen的一个小错误,还是有另一个解释呢?

1 个答案:

答案 0 :(得分:0)

这里实际发生的是服务器在发生错误之前发起的一些重定向:

  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-结构化的程序比较/(确切地说是'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/'
  5. 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。