Как вы выбираете варианты в форме, используя Python? - PullRequest
10 голосов
/ 15 июня 2011

Я хотел бы знать, как выбрать параметры в форме, которая отформатирована как

  <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, а затем указать механизму нажать кнопку «Отправить». Какой бы быстрый способ включить опцию, основанную на имени формы?

Ответы [ 2 ]

22 голосов
/ 15 июня 2011

Вот несколько основных примеров использования:

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

Вы можете найти больше информации здесь (ссылка украдена у Мэтт Хемпель :).

3 голосов
/ 15 июня 2011

Когда вы говорите, что страница имеет несколько форм, вы имеете в виду, что на странице есть несколько элементов <form> или несколько полей формы (например, <select>)?

Механизировать документы для python , в общих чертах описывающих, как выбирать элементы списка . Вот образец, который они предоставляют:

# 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"]
...