ItemNotFoundError с выбором вариантов в форме с использованием механизации Python - PullRequest
0 голосов
/ 29 ноября 2011

Вот форма:

<p><label for="version_id">Version</label>
<select id="version_id" name="version_id"><option></option>
<option value="value1">2.1.1</option>
<option value="value2">2.1.2</option>
<option value="value3">2.1.3</option>
<option value="value4">2.1.4</option></select></p>

Мой код Python:

import mechanize
br = mechanize.Browser()
br.open('http://www.example.com/html/html_forms.asp')
br["version_id"] = ["value2"] # works
br["version_id"] = ["2.1.2"] # don't work

Сообщение об ошибке:

File "build/bdist.macosx-10.7-intel/egg/mechanize/_form.py", line 2782, in __setitem__
File "build/bdist.macosx-10.7-intel/egg/mechanize/_form.py", line 1977, in __setattr__
File "build/bdist.macosx-10.7-intel/egg/mechanize/_form.py", line 1998, in _set_value
File "build/bdist.macosx-10.7-intel/egg/mechanize/_form.py", line 2021, in _single_set_value
File "build/bdist.macosx-10.7-intel/egg/mechanize/_form.py", line 2006, in _get_items
mechanize._form.ItemNotFoundError: insufficient items with name '2.1.2'

Мой скрипт просто знает о "2.1.2 "var, как я могу установить выбранное значение, используя" 2.1.2 ", а не" value2 "?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2011

Я думаю, что вы можете получить это, анализируя форму.Я выполнил быстрый поиск, чтобы найти сайт с раскрывающимся списком html на странице, чтобы вы могли напрямую попробовать приведенный ниже пример.

>>> import mechanize
>>> br = mechanize.Browser()
>>> br.open("http://www.htmlcodetutorial.com/linking/linking_famsupp_114.html")
<response_seek_wrapper at 0x2b4b238 (...)>
>>> _, f = br.forms()                      # Select second form
>>> c = f.find_control('gourl')            # Select dropdown control
>>> c.set_value_by_label(['Idocs.com'])    # Select the item with this label

Если вы посмотрите на выбранное состояние, оно кажется выбранным:

>>> c.items[2]._selected
True
>>> c.set_value_by_label(['Ninth Wonder'])
>>> c.items[2]._selected
False
0 голосов
/ 29 ноября 2011

Глядя немного на API, думаю, вы можете использовать set_value_by_label:

>>> br.form.set_value(['value2'], name='version_id')
>>> br.form.set_value_by_label(['2.1.2'], name='version_id')
>>> br.form['version_id']
['value2']
>>> br.form.get_value('version_id')
['value2']
>>> br.form.get_value_by_label('version_id')
['2.1.2']
...