如何用Python选择表单中的选项?

11 投票
2 回答
19564 浏览
提问于 2025-04-16 19:37

我想知道如何在一个格式像这样的表单中选择选项

  <td align="left">
                  <select name="FORM1" id="FORM1" multiple="multiple" size="5">
                      <option value="Value1">Value1</option>
                      <option value="Value2">Value2</option>
                  </select>
  </td>

现在,我正在使用 mechanize 这个工具来连接到网站,并进入我想要的页面。这个页面有很多表单,比如 FORM1、FORM2、FORM3 等等,每个表单都有选项。我想选择(启用)Value1,然后告诉 mechanize 的实例去点击提交按钮。有没有什么简单的方法可以根据表单名称来启用一个选项呢?

2 个回答

3

当你说页面上有多个表单时,你是指页面上有多个 <form> 元素,还是指有多个表单字段(比如 <select>)呢?

Python的Mechanize文档中有介绍如何选择列表项,你可以在这里查看:选择列表项的说明。下面是他们提供的示例:

# Controls that represent lists (checkbox, select and radio lists) are
# ListControl instances.  Their values are sequences of list item names.
# They come in two flavours: single- and multiple-selection:
form["favorite_cheese"] = ["brie"]  # single

在你的情况下,选择 Value1 的代码看起来是这样的:

form["FORM1"] = ["Value1"]
23

这里有一些基本的使用示例,帮助你入门:

>>> import mechanize
>>> br = mechanize.Browser()
>>> br.open('http://www.w3schools.com/html/html_forms.asp')

表单有一个 name 属性;不过有时候这个属性是空的:

>>> [f.name for f in br.forms()]
['searchform', None, None, None, None, 'input0']

表单里有一系列的控件;这些控件也有自己的名字:

>>> forms = [f for f in br.forms()]
>>> forms[1].controls[0].name
'firstname'
>>> [c.name for c in forms[3].controls]
['sex']

你可以获取控件中项目的列表:

>>> forms[3].controls[0].get_items()
[<Item name='male' id=None type='radio' name='sex' value='male'>, <Item name='female' id=None type='radio' name='sex' value='female'>]

对于单选按钮,你只能选择一个:

>>> forms[3]['sex'] = ['male']

但是这个选择必须在一个列表中:

>>> forms[3]['sex'] = 'male'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.6/site-packages/mechanize/_form.py", line 2782, in __setitem__
    control.value = value
  File "/Library/Python/2.6/site-packages/mechanize/_form.py", line 1977, in __setattr__
    self._set_value(value)
  File "/Library/Python/2.6/site-packages/mechanize/_form.py", line 1985, in _set_value
    raise TypeError("ListControl, must set a sequence")
TypeError: ListControl, must set a sequence

对于复选框,你可以选择多个:

>>> [(c.name, c.get_items()) for c in forms[4].controls]
[('vehicle', [<Item name='Bike' id=None type='checkbox' name='vehicle' value='Bike'>, <Item name='Car' id=None type='checkbox' name='vehicle' value='Car'>])]
>>> forms[4]['vehicle'] = ['Bike', 'Car']

你可以在 这里 找到更多信息(这个链接是从 Matt Hempel 那里借来的 :))。

撰写回答