2013-11-27 19 views
3

我刚开始尝试通过机械化提交webforms。在this webpage有一个项目清单,MASTER_MODS。可以使用按钮add_IT_MODS(参见底部的图)使用或IT_MODS选择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

如何添加项目到MODSIT_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

要将项目添加到列表容器,实例化一个项目,其控制 和属性: 注意,你有责任因为 由于 违约规则和一些特殊属性(例如,代表OPTION在其.attrs字典中具有特殊“内容”键的项目),所以这些与原始HTML不完全相同。在将来 中,将会有一种明确支持的方式,即在不知道这些详细信息的情况下使用解析逻辑来添加来自HTML字符串的项目和控件。 mechanize.Item(cheeses, {"contents": "mascarpone", "value": "mascarpone"})

+0

@NiekdeKlein不知道你是否在聊天中看到这个:我相信这个列表的目的是单选,因为你使用选择来添加/删除项目,而不是选择提交内容。一旦事情在MODS列表中,我认为这足以让他们提交,你不必担心选择它们。你可能确实需要删除那个默认项目。 – KobeJohn