pycurl,如何发送多选表单的POST数据?

时间:2013-08-29 15:10:39

标签: python curl web-scraping libcurl pycurl

我正在尝试进行一些网页抓取,它涉及发送一个带有多选框列表的表单,该列表与此类似:

<select name="multipleSelectForm" multiple="multiple" size="5">
    <option value="value1">value1</option>
    <option value="value2">value2</option>
</select>

现在,我想使用pycurl发送value1和value2,例如:

import urllib
import pycurl

c = pycurl.Curl()

data = {'multipleSelectForm':'value1',
        'multipleSelectForm':'value2'}

c.setopt(c.URL, 'http://www.example.com')

c.setopt(c.POST, 1)
post = urllib.urlencode(data)
c.setopt(c.POSTFIELDS, post)

c.perform()

现在明显的问题是它多次发送multipleSelectForm。我很确定所请求的页面可能正在寻找一个multipleSelectForm数组,而不仅仅是单个变量(这只是猜测,我实际上并不确定),因此它收到的POST数据不正确。

我尝试使用Google Chrome的开发工具查看其正在进行的操作的流量,当我查看表单数据时,它看起来像这样:

multipleSelectForm:value1
multipleSelectForm:value2

如果有人愿意提供帮助,我对如何处理所有这些事情感到有点迷失

1 个答案:

答案 0 :(得分:1)

从那以后,您发送的数据看起来就像是

{ 'multipleSelectForm':'value2' }

因为它是一本字典。如果你将它设置为元组对,它将做你想要的。

data = (('multipleSelectForm', 'value1'), ('multipleSelectForm', 'value2'))

您可以通过设置一个微小的调试http服务器来测试自己:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer                                                                                                                                                                                                                     

class hand(BaseHTTPRequestHandler):                                          
    def __init__(self, socket, *args):                                       
        print socket.recv(10000)                                             

server = HTTPServer(('', 8080), hand)                                        
server.serve_forever()                                                       

然后用你的脚本点击它。我用这个来确认传递元组列表符合我的预期。