发送多个值的名称urllib2

2024-04-25 00:42:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试这样提交一个网页,有复选框,我需要这些复选框多达10个选中

问题是,当我试图把它们分配给一个dict中的一个名字时,它只指定最后一个,而不是全部10个

我该怎么做这是请求代码:

forms = {"_ref_ck": ref,
         "type": "create",
         "selected_items[]": sel_itms[0],
         "selected_items[]": sel_itms[1],
         "selected_items[]": sel_itms[2],
         "selected_items[]": sel_itms[3],
         "selected_items[]": sel_itms[4],
         "selected_items[]": sel_itms[5],
         "selected_items[]": sel_itms[6],
         "selected_items[]": sel_itms[7],
         "selected_items[]": sel_itms[8],
         "selected_items[]": sel_itms[9]

         }
data = urllib.urlencode(forms)
req = urllib2.Request('http://www.neopets.com/island/process_tradingpost.phtml',data)
res = self.opener.open(req)
html =  res.read()

这是可行的,但我只为"selected_itmes[]"发送一个值,当我查看web调试代理中的实际请求时,它会为"selected_items[]"发送多个值,但我不知道如何使用python

请帮忙谢谢!!在


Tags: 代码ref网页dataitemsresforms名字
2条回答

这个问题与urlencode无关;它是Python dict不能为同一个键保存多个值。您可以通过print输出forms来看到这个,在发送之前,selected_items[]只有一个值。这一个值被编码得很好。在

正如the documentation所解释的,有两种方法可以解决这个问题。在

首先,可以将一系列值附加到一个键上,并使用doseq=True标志:

forms = {"_ref_ck": ref,
     "type": "create",
     "selected_items[]": sel_itms[:10]
     }
 data = urllib.urlencode(forms, doseq=True)

或者,可以传递两个元素元组的序列,而不是映射:

^{pr2}$

(您也可以使用允许重复键的自定义Mapping类型,而不是标准的dict,但这可能有点过头了。尤其是因为构造这样一个定制的Mapping类型的通常方法是传递给它一系列键-值对……)

您可以通过创建一个类并使其返回相同的字符串来实现这一点。 在Python3中:

import urllib.parse

class Value(object):
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return self.name

params = {Value("selected_items[]"): "one",
Value("selected_items[]"): "two"}

data = urllib.parse.urlencode(params)
print(data)

输出为:

selected_items%5B%5D=one&selected_items%5B%5D=two

解决方案是taken from here

相关问题 更多 >