2013-11-27 3 views
3

Я только начал экспериментировать с отправкой webforms через механизацию. На странице this webpage есть список товаров на выбор, MASTER_MODS. Они могут быть выбраны либо в MODS с использованием butten add_MODS, либо в IT_MODS с помощью кнопки add_IT_MODS (см. Рисунок внизу). В виде она выглядит следующим образом (код для формы в нижней части):Механизировать, как добавить в список выбора?

<<SNIP>> 
<SelectControl(MODS=[*--- none selected ---])> 
<IgnoreControl(add_MODS=<None>)> 
<SelectControl(MASTER_MODS=[])> 
<SelectControl(IT_MODS=[*--- none selected ---])> 
<IgnoreControl(remove_IT_MODS=<None>)> 
<IgnoreControl(add_IT_MODS=<None>)> 
<<SNIP>> 

Так что я хочу, чтобы добавить к <SelectControl(MODS=[*--- none selected ---])> и <SelectControl(IT_MODS=[*--- none selected ---])>. Однако, когда я пытаюсь добавить элемент непосредственно с

br.form[ 'MODS'] = ['Acetyl (N-term)'] 

Я получаю mechanize._form.ItemNotFoundError: insufficient items with name 'Acetyl (N-term)'

И когда я пытаюсь

br.form[ 'add_MODS'] = 'Acetyl (N-term)' 

я ValueError: control 'add_MODS' is ignored, hence read-only.

Как добавить товар в MODS и IT_MODS?


Рисунок и код enter image description here

Код:

from mechanize import Browser, _http 
br = Browser()  
br.set_handle_robots(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
url = "http://www.matrixscience.com/cgi/search_form.pl?FORMVER=2&SEARCH=MIS" 
br.select_form('mainSearch') 
br.open(url) 
print br.form 
+0

Я получаю «фатальную ошибку» на вашем примере ссылки. – KobeJohn

+0

@kobejohn У меня был задний], исправленный сейчас. –

+0

У меня нет опыта работы в механизации, но у меня есть куча вопросов. Присоединяйтесь ко мне в [чате] (http://chat.stackoverflow.com/rooms/42047/mechanize-how-to-add-to-a-select-list)? – KobeJohn

ответ

3

Попробуйте это? Объяснение в комментариях.

from mechanize import Browser, Item 
br = Browser() 
br.set_handle_robots(False) 
br.addheaders = [('User-agent', 
        'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1)' 
        ' Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
url = 'http://www.matrixscience.com'\ 
     '/cgi/search_form.pl?FORMVER=2&SEARCH=MIS' 
br.open(url) 
br.select_form('mainSearch') 

# get the actual control object instead of its contents 
mods = br.find_control('MODS') 
# add an item 
item = Item(mods, {"contents": "Acetyl (N-term)", "value": "Acetyl (N-term)"}) 
# select it. if you don't, it doesn't appear in the output 
# this is probably why MASTER_MODS appears empty 
item.selected = True 
print br['MODS'] 
# outputs: ['Acetyl (N-term)'] 

Предполагая, что это работает, я получил его от комментариев в the docs:

Для добавления элементов в контейнер списка, экземпляр элемента с его контролем и атрибуты: Обратите внимание, что вы несете ответственность для получения атрибутов здесь, , и они не совсем идентичны исходному HTML, из-за правил дефолта и нескольких специальных атрибутов (например, элементы, которые представляют ОПЦИИ имеют специальный ключ «содержимого» в их .attrs dict). В будущем будет явно поддерживаться способ использования логики синтаксического анализа до добавлять элементы и элементы управления из строк HTML, не зная этих деталей. mechanize.Item(cheeses, {"contents": "mascarpone", "value": "mascarpone"})

+0

@NiekdeKlein не уверен, что вы видели это в чате: я считаю, что этот список предназначен для одного выбора, потому что вы используете выбор, чтобы добавлять/удалять элементы из него, а не выбирать, что подавать. Как только вещи находятся в списке модов, я думаю, что их достаточно, чтобы их можно было отправить, и вам не придется беспокоиться о их выборе. Вероятно, вам нужно удалить этот элемент по умолчанию. – KobeJohn

Смежные вопросы