mechanize:为什么表单列表只包含1个元素?

2024-09-29 23:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个机械化的新手,也不是最高级的python用户,但是我想自动化一个任务,在这个任务中我想给一个网页一个输入。现在的问题是,“提交”按钮没有分配给它的控件名。所以我做了一点研究,找到了一种方法来给这个表单设置一个值。但要做到这一点,我必须访问我想要赋值的特定表单。所以我的代码是这样的:

forms = [f for f in br.forms()]
print forms[0].controls[0].name

我只是想我可以通过写forms[x]来访问表单,然后类似于:

^{pr2}$

我得到的错误是:

    forms[54].set_value("VALUE",nr=100)
IndexError: list index out of range

这可能是一个有点愚蠢的问题,可能是因为我并不真正理解我正在使用的功能,但由于没有真正的纪录片,我真的很感谢你的一句帮助。在

附言:我可以用打印所有的表格

for f in br.forms():
    print f

带输出:

 <CheckboxControl(lookup=[yes])>
  <TextControl(fld=NoName)>
  <TextControl(pixemail=)>
  <IgnoreControl(<None>=<None>)>
  <TextControl(ra=00 00 00.0)>
  <TextControl(dec=00 00 00.0)>
  <SelectControl(equinox=[*J2000.0, B1950.0])>
  <TextControl(offra=0.0)>
  <TextControl(offdec=0.0)>
  <TextControl(epoch=2000.0)>
  <SubmitControl(<None>= Retrieve Data ) (readonly)>
  <RadioControl(cextract=[*rect, circle])>
  <TextControl(rawid=10.0)>
  <TextControl(decwid=10.0)>
  <SelectControl(wunits=[Degrees, *Minutes, Seconds])>
  <TextControl(cirrad=10.0)>
  <SelectControl(cat=[UCAC 2, UCAC 3, NOMAD, *USNO B1.0, USNO A2.0, ACT])>
  <SelectControl(surims=[None, *All Surveys, POSS-I (103aO, 103aE), POSS-II (IIIaJ, IIIaF, IV-N), SOUTH, AAO-R, POSS-IO, POSS-IE, POSS-IIJ, POSS-IIF, POSS-IIN, SRC-J, SERC-EJ, ESO-R, SERC-ER])>
  <CheckboxControl(getcat=[*yes])>
  <CheckboxControl(getfin=[*yes])>
  <CheckboxControl(pixflg=[yes])>
  <CheckboxControl(colbits=[All, *cb_id, *cb_altid, *cb_ra, *cb_sigra, cb_mep, *cb_mura, cb_muprob, *cb_smura, cb_sfitra, *cb_fitpts, cb_err, *cb_flg, *cb_mag, cb_smag, *cb_mflg, *cb_fldid, *cb_sg, cb_xres, cb_pltidx, *cb_xi, *cb_dstctr, *cb_gall])>
  <RadioControl(skey=[*ra, dec, sigra, sigdec, mep, mura, mudec, muprob, smura, smudec, sfitra, sfitdec, fitpts, err, flg, mag, smag, mflg, fldid, sg, xres, yres, pltidx, clr, sigpos, mutot, sigmu, xi, eta, dstctr, gall, galb])>
  <SelectControl(slf=[*hh/dd mm ss, hh/dd:mm:ss, hh.hhh/dd.ddd, ddd.ddd/dd.ddd])>
  <TextControl(minnpts=0)>
  <TextControl(maxnpts=10)>
  <SelectControl(clr=[B1, R1, B2, *R2, I2, B, V, R, J, H, K])>
  <TextControl(bri=0)>
  <TextControl(fai=100)>
  <SelectControl(clr0m1A=[B1, R1, *B2, R2, I2, B, V, R, J, H, K])>
  <SelectControl(clr0m1B=[B1, R1, B2, *R2, I2, B, V, R, J, H, K])>
  <TextControl(bmrmin=-100)>
  <TextControl(bmrmax=100)>
  <TextControl(minposnerr=0.0)>
  <TextControl(maxposnerr=10000.0)>
  <TextControl(mumin=0.0)>
  <TextControl(mumax=10000.0)>
  <TextControl(minmuerr=0.0)>
  <TextControl(maxmuerr=10000.0)>
  <TextControl(minsep=0.0)>
  <HiddenControl(minmagerr=0.0) (readonly)>
  <HiddenControl(maxmagerr=1.0) (readonly)>
  <SelectControl(opstars=[Yes, *No])>
  <SelectControl(whorbl=[Light Stars/Dark Sky, *Dark Stars/Light Sky])>
  <SelectControl(pixgraph=[Progressive JPEG, *JPEG, GIF, PDF, Large JPEG (1 Survey Only), Large GIF (1 Survey Only), PS (1 Survey Only)])>
  <SelectControl(pixfits=[Yes, *No])>
  <SelectControl(ori=[NE - North Up, East Right, *NW - North Up, East Left, SE - North Down, East Right, SW - North Down, East Left, EN - East Up, North Right, ES - East Up, North Left, WN - East Down, North Right, WS - East Down, North Left])>
  <SelectControl(tck=[N and E marks, *Tick Marks, Grid Lines])>
  <SelectControl(starlbl=[Yes, *No])>
  <SelectControl(cmrk=[*None, 5.0 sec Box, 10.0 sec Box, 30.0 sec Box, 1.0 min Box, 2.0 min Box, 5.0 min Box, 10.0 min Box, 5.0 sec Circle, 10.0 sec Circle, 30.0 sec Circle, 1.0 min Circle, 2.0 min Circle, 5.0 min Circle, 10.0 min Circle])>
  <TextControl(aobj=none)>
  <SelectControl(pcl=[*P - Points, L - Points + Labels, C - Connected Points, A - Connected Points + Labels])>
  <TextareaControl(atbl=  )>
  <IgnoreControl(<None>=<None>)>
  <SubmitControl(<None>= Retrieve Data ) (readonly)>
  <SelectControl(gzf=[*Yes, No])>
  <SelectControl(cftype=[*ASCII, XML/VO])>>

我想弄到的是<SubmitControl(<None>=Retrieve Data ) (readonly)>,这是从下至上数的第三个。在


Tags: boxnoneformssecminyescbeast
3条回答

我很确定有更好的方法来实现这一点,但我对Mechanize一点也不熟悉。你可以做如下事情:

submit_values = filter(lambda x: 'SubmitControl' in str(x), br.forms())
if submit_values:
    print(submit_values[0])

如果有不止一个,显然你会得到不止一个。这可能是最奇怪的方法来完成你想做的任何事情。另外,假设这个表单相当静态,您可以用requests替换Mechanize的用法。然后看起来像这样:

^{pr2}$

试试这个。可以按控件类型搜索没有名称的控件。从记忆中可以看出:

br.form.find_control(type='submit', nr=1)

我认为这是正确的语法。。我再检查一下再确认一下。在

试试这个:

import mechanize

br = mechanize.Browser()

# Insert the desired URL here
br.open('http://www.nofs.navy.mil/data/fchpix/cfch.html#fchmenu')
br.select_form(nr=0)

br["ra"] = "input 1"
br["dec"] = "input 2"
br["pixfits"] = ["Yes"]

br.find_control("pixflg").items[0].selected=True

response = br.submit()

相关问题 更多 >

    热门问题