使用Mechanize使用Python发送POST参数

时间:2012-06-30 18:11:19

标签: python post upload mechanize ambiguity

我想用Python填写此表单:

    <form method="post" enctype="multipart/form-data" id="uploadimage">
  <input type="file" name="image" id="image" />
  <input type="submit" name="button" id="button" value="Upload File" class="inputbuttons" />
  <input name="newimage" type="hidden" id="image" value="1" />
  <input name="path" type="hidden" id="imagepath" value="/var/www/httpdocs/images/" />
</form>

正如您所看到的,有两个名称完全相同的参数,因此当我使用Mechanize执行此操作时,看起来像这样:

    import mechanize
    br = mechanize.Browser()
    br.open('www.site.tld/upload.php')
    br.select_form(nr=0)

    br.form['image'] = '/home/user/Desktop/image.jpg'
    br.submit()

我收到错误:

mechanize._form.AmbiguityError: more than one control matching name 'image'

我在互联网(包括本网站)中找到的每个解决方案都不起作用。有不同的方法吗? 遗憾的是,重命名HTML表单中的输入不是一种选择。

先谢谢。

1 个答案:

答案 0 :(得分:0)

您应该使用find_control代替;如果存在歧义,您可以添加nr关键字来选择特定控件。在您的情况下,nametype关键字应该这样做。

另请注意,文件控件不会占用value;请改用add_file并传入一个打开的文件对象:

br.form.find_control(name='image', type='file').add_file(
    open('/home/user/Desktop/image.jpg', 'rb'), 'image/jpg', 'image.jpg')

请参阅documentation on forms in mechanize