7

我正在尝试提交一个带有复选框的网页,我需要最多选中其中的 10 个复选框

问题是当我尝试将它们分配给字典中的一个名称时,它只分配最后一个而不是全部 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

请帮忙谢谢!!

4

2 回答 2

13

问题无关urlencode;这是 Python dict 不能为同一个键保存多个值。您可以在发送之前通过printing out看到这forms一点 - 那里只有一个值selected_items[]。那个值被编码得很好。

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

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

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

或者,您可以传递一系列二元素元组而不是映射:

forms = (("_ref_ck", ref),
         ("type", "create"),
         ("selected_items[]", sel_itms[0]),
         ("selected_items[]", sel_itms[1]),
         # ...
         )
data = urllib.urlencode(forms)

(您也可以使用Mapping允许重复键的自定义类型,而不是标准的dict,但这可能有点过头了。特别是因为构造这种自定义Mapping类型的常用方法是传递一系列键值对......)

于 2013-08-13T06:15:31.843 回答
1

您可以通过创建一个类并使其返回相同的字符串来做到这一点。在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

解决方案取自这里

于 2018-04-16T10:55:52.197 回答