机制化如何添加到选择列表?

时间:2013-11-27 14:29:20

标签: python mechanize

我刚开始尝试通过mechanize提交webforms。在this webpage上有一个可供选择的项目列表MASTER_MODS。可以使用按钮MODSadd_MODS中选择,也可以使用按钮IT_MODSadd_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

如何向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

1 个答案:

答案 0 :(得分: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中的评论中得到了它:

  

要将项添加到列表容器,请使用其控件实例化Item   和属性:   请注意,您有责任在此处获取正确的属性,   由于这些与原始HTML不完全相同   默认规则和一些特殊属性(例如代表的项目)   OPTION在他们的.attrs dict中有一个特殊的“内容”键。在未来   将有一种明确支持的使用解析逻辑的方法   从HTML字符串添加项目和控件,而不知道这些细节。   mechanize.Item(cheeses, {"contents": "mascarpone", "value": "mascarpone"})