How do you select choices in a form using Python?

元气小坏坏 提交于 2019-12-03 06:13:42

问题


I'd like to know how to select options in a form that is formatted like

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

Right now, I am using mechanize to connect to the website and traverse to the desired page. This page has many forms such as FORM1, FORM2, FORM3, etc. with options. I'd like to select (enable) Value1 then tell the instance of mechanize to hit the submit button. Which would be a quick way to enable an option based on the form name?


回答1:


Here are some basic usage examples to get you going:

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

Forms have a name attribute; sometimes it's empty though:

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

Forms have a sequence of controls; controls also have names:

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

You can get a listing of items in a control:

>>> 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'>]

For radio buttons, you have to make a single selection:

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

But the selection has to be in a list:

>>> 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

For check boxes you can make multiple selections:

>>> [(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']

You can find more info here (link stolen from Matt Hempel :).




回答2:


When you say the page has multiple forms, do you mean there are multiple <form> elements on the page, or multiple form fields (like <select>)?

The Mechanize docs for python sketch out how to select list items. Here's the sample they provide:

# 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

In your case, the code to select Value1 would look like this:

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


来源:https://stackoverflow.com/questions/6359817/how-do-you-select-choices-in-a-form-using-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!