【问题标题】:How to perform HTTP 303 redirect with urllib2 in python?如何在 python 中使用 urllib2 执行 HTTP 303 重定向?
【发布时间】:2011-11-01 18:23:19
【问题描述】:

我有一个要获取的 url,它提供了一个 HTTP 303 重定向:

import urllib2 as web
import sys

url='http://sample.com'

try: handle=web.urlopen(url)
except web.HTTPError, e:
  print e.code
  sys.exit(1)
data=handle.read()
print 'Result :'
print data

所以,上面的代码打印了303,结果是一个303重定向。

我希望它遵循重定向并获取目标的 HTML。

请帮忙..

编辑:

curl -I http://my303redirecturl.com/

HTTP/1.1 303 See Other
Date: Tue, 23 Aug 2011 04:53:53 IST
Server: Mule Core/3.1.2
Expires: Tue, 23 Aug 2011 04:53:53 IST
http.status: 303
Content-Type: application/json
MULE_ENCODING: UTF-8
Content-Length: 0
Connection: close

这会有帮助吗?

【问题讨论】:

  • 您使用的是哪个 Python 版本?
  • Python 版本 = Python 2.6.6
  • 使用 cPython 2.6.7,我无法重现该问题。您可以尝试我的答案中的演示代码并报告给您的结果吗?

标签: python redirect urllib2 http-error


【解决方案1】:

This 页面提供了关于如何使用 urllib 处理 HTTP 重定向的很好的总结。

HTH

编辑:本文展示了如何检索重定向 URL,然后可以使用另一个 urlopen 请求该 URL。

【讨论】:

  • 它谈论的是检测它们,而不是我所要求的。
  • 它显示了您如何检测重定向,这是真的。但它也说明了如何检索重定向的 URL,您现在可以使用额外的 urlopen 请求该 URL。
【解决方案2】:

urllib2 默认应该遵循 303 重定向。使用以下示例进行测试:

import urllib2
url = 'http://phihag.de/2011/so/303/'
print(urllib2.urlopen(url).read())

如果上面的代码打印出 example.net 的内容,但您的 URL 没有,则有问题的 URL 没有解析为正确的 303 重定向。如果是这种情况,您可以使用urllib2.build_opener 来获得一个使用您自己的BaseHandler 实现而不是默认的HTTPRedirectHandler 的开启程序。

【讨论】:

  • 我希望它从重定向的 url 中获取数据。
  • @Yugal Jindle 这意味着您的 URL 没有执行正确的 303 重定向。你能发帖吗?请注意,对于有效的 303 重定向 URL http://phihag.de/2011/so/303/,“从重定向的 URL 获取数据”正是此答案中的 Python 代码所做的。
  • @Yugal Jindle 然后走到那台服务器的管理员/开发人员那里,用HTTP spec 打他的脸;)另外,如果你想让我们帮助你,你必须给我们的东西,例如curl -I URL.in/your/network的输出左右。
  • 我添加了 Curl -I url 的输出
  • @Yugal Jindle 正如我预测的那样,这不是一个有效的 HTTP 303 响应,它缺少 Location: HTTP 标头。此标头包含重定向到的 URL。由于它根本不存在,因此 Python 或任何其他程序(甚至人类)无法遵循该重定向。请联系该服务器的管理员/开发人员。
猜你喜欢
  • 2015-06-20
  • 2014-12-02
  • 2012-12-18
  • 2015-06-23
  • 2015-11-20
  • 1970-01-01
  • 2012-04-13
  • 2011-01-23
  • 1970-01-01
相关资源
最近更新 更多