9

我有一个 urllib2 开启器,并希望将它用于带有一些数据的 POST 请求。

我希望收到我要发布到的页面的内容,以及返回的页面的 URL(我认为这只是一个 30 倍的代码;所以这些方面的东西会很棒!)。

将此视为代码:

anOpener = urllib2.build_opener(???,???)
anOpener.addheaders = [(???,???),(???,???),...,(???,???)]
# do some other stuff with the opener 
data = urllib.urlencode(dictionaryWithPostValues)
pageContent = anOpener.THE_ANSWER_TO_THIS_QUESTION
pageURL = anOpener.THE_SECOND_PART_OF_THIS_QUESTION
4

3 回答 3

6

一旦意识到答案,这是一个非常愚蠢的问题。

只需使用:

open(URL,data)

对于第一部分,就像雷切尔桑德斯提到的,

geturl()

第二部分。

不过,我真的不知道整个请求/开启者是如何工作的;我找不到任何好的文档:/

于 2012-11-19T06:24:09.900 回答
5

此页面应该可以帮助您:

http://www.voidspace.org.uk/python/articles/urllib2.shtml#data

import urllib
import urllib2

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
      'location' : 'Northampton',
      'language' : 'Python' }

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
the_url  = response.geturl() # <- doc claims this gets the redirected url

看起来您也可以使用 response.info() 直接获取 Location 标头,而不是使用 .geturl()。

希望有帮助!

于 2012-11-19T06:03:24.317 回答
0

如果您向请求中添加数据,该方法会自动更改为 POST。查看以下示例:

import urllib2
import json

url = "http://server.local/x/y"
data = {"name":"JackBauer"}
method = "PUT"
request = urllib2.Request(url)
request.add_header("Content-Type", "application/json")
request.get_method = lambda: method
if data: request.add_data(json.dumps(data))
response = urllib2.urlopen(request)
if response: print response.read()

正如我提到的,如果您使用 GET/POST,则不需要 lambda。

于 2012-11-19T09:36:13.303 回答