I'd like to know how to select options in a form that is formatted like
Value1
Value2
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?
解决方案
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()
[, ]
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 "", line 1, in
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', [, ])]
>>> forms[4]['vehicle'] = ['Bike', 'Car']
You can find more info here (link stolen from Matt Hempel :).