Python 2.7 urllib2 在使用 xml 内容点击重定向时引发 urllib2.HTTPError 301

Posted

技术标签:

【中文标题】Python 2.7 urllib2 在使用 xml 内容点击重定向时引发 urllib2.HTTPError 301【英文标题】:Python 2.7 urllib2 raising urllib2.HTTPError 301 when hitting redirect with xml content 【发布时间】:2017-12-29 09:44:13 【问题描述】:

我正在使用 urllib2 在hxxp://s3.amazonaws.com/mybucket 请求特定的 S3 存储桶。亚马逊发回一个 301 的 HTTP 代码以及一些 XML 数据(重定向到 hxxp://mybucket.s3.amazonaws.com/)。 python 没有遵循重定向,而是引发urllib2.HTTPError: HTTP Error 301: Moved Permanently

根据HOWTO Fetch Internet Resources Using urllib2 的官方 Python 文档,“默认处理程序处理重定向(300 范围内的代码)”。

是 python 处理不正确(可能是因为响应中出现了意外的 XML),还是我做错了什么?我在 Wireshark 中看过,对 python 的请求的响应与使用 Web 客户端对我的响应完全相同。在调试中,我没有看到响应对象中的任何地方都捕获了 XML。

感谢您的指导。

编辑:很抱歉最初没有发布代码。没什么特别的,字面意思就是这样 -

import urllib2, httplib

request = urllib2.Request(site)
response = urllib2.urlopen(request)

【问题讨论】:

代码在哪里?请提供minimal reproducible example。 抱歉,现在添加。我没有使用任何特殊的处理程序或做很多事情。 @KayBalearica 你可以考虑切换到requests 模块。 @cᴏʟᴅsᴘᴇᴇᴅ 感谢您的建议。它为我正确处理。 urllib2 行为对您来说是不是一个错误? @COLDSPEED 哈哈,够公平的! 【参考方案1】:

您最好使用requests 库。 requests 默认处理重定向:http://docs.python-requests.org/en/latest/user/quickstart/#redirection-and-history

import requests

response = requests.get(site)
print(response.content)

我没有得到 urllib2 的问题,我尝试查看文档 https://docs.python.org/2/library/urllib2.html,但它看起来并不直观。

似乎在 Python3 中,他们对其进行了重构以减轻使用负担,但我仍然坚信 requests 是要走的路。

注意 urllib2 模块已拆分为多个模块 Python 3 命名为 urllib.request 和 urllib.error。 2to3 工具将 将源代码转换为 Python 3 时自动调整导入。

【讨论】:

谢谢。看起来这就是我最终会做的事情。不过,我仍然很想知道这是否是预期的 urllib2 行为。

以上是关于Python 2.7 urllib2 在使用 xml 内容点击重定向时引发 urllib2.HTTPError 301的主要内容,如果未能解决你的问题,请参考以下文章

1.Urllib2模块使用

urllib与urllib2的学习总结

python urllib2.urlopen(url).read()乱码

Python 2.7获取网站源代码的几种方式

Python 2.7获取网站源代码的几种方式_20160924

Python爬虫_urllib2的使用