Как вы выбираете варианты в форме с помощью Python?

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

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

Прямо сейчас я использую механизацию для подключения к веб-сайту и перехода на нужную страницу. На этой странице есть много форм, таких как FORM1, FORM2, FORM3 и т. д. с опциями. Я хотел бы выбрать (включить) Value1, а затем сообщить экземпляру mechanize нажать кнопку отправки. Каким будет быстрый способ включить опцию на основе имени формы?


person user791953    schedule 15.06.2011    source источник


Ответы (2)


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

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

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

person senderle    schedule 15.06.2011

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

Документация Mechanize для 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"]
person Matt Hampel    schedule 15.06.2011
comment
Спасибо, что поймали это. Исправлено. - person Matt Hampel; 15.06.2011
comment
что, если опция ‹option value=Value1›content1‹/option›? form[FORM1] = [Value1] не работает, как обращаться с содержимым1? Спасибо - person user392412; 29.11.2011