【问题标题】:mechanize: Why does my form list only contain 1 element?mechanize:为什么我的表单列表只包含 1 个元素?
【发布时间】:2014-04-04 10:49:52
【问题描述】:

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

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

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

forms[x].set_value("VALUE", 
                       nr=5)

我得到的错误是:

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

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

PS:我可以使用打印所有表格

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])>>

我想上手的是&lt;SubmitControl(&lt;None&gt;=Retrieve Data ) (readonly)&gt;,从下往上数第三个。

【问题讨论】:

  • 您不需要按钮来提交表单。这会解决您的问题还是您真的需要设置该值?
  • 不计算所有表格,有没有可能根本就没有 54 个?您不能通过索引lst[len(lst)] = item 来添加到列表,您需要lst.append(item)
  • 它也不适用于 form[1]...
  • @Hal: 不,我只需要提交一个表格...有没有简单的方法?

标签: python forms mechanize


【解决方案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()

【讨论】:

  • 好吧,这很奇怪......当我写:forms = [f for f in br.forms()];表格=表格[0]; form.set_value("检索数据",nr=54);它说:“AttributeError:控制‘无’是只读的”。但是当我运行你的代码时,它说:“mechanize._mechanize.FormNotFoundError: no form matching nr 54”
  • 你不需要它,它只是使用 DOM 中表单的索引。第一个表单的索引为 0,第二个表单的索引为 1,第三个表单的索引为 3,依此类推...
  • 检查索引是否正确。我写了 54 是因为它似乎是您想要的表单的 ID,但无论如何都要检查它,因为它应该可以开箱即用。
  • 嗯...基本上它确实适用于我在我对您的回答的第一条评论中写的内容,因此 ID 确实是正确的...此外,我可以选择我想要的任何 ID,每次我得到“没有匹配 nr x 的形式”。这是网页,如果有帮助:nofs.navy.mil/data/fchpix/cfch.html#fchmenu。无论如何,非常感谢您的努力。
  • 所以这意味着我完全愚蠢或者页面很奇怪?
【解决方案2】:

我很确定有更好的方法来做到这一点 - 但我对机械化一点也不熟悉。您可以执行以下操作:

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

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

import requests

r = requests.post("http://form/action/url/goes/here", data={"lookup": "yes",
                                                            # all the other elements
                                                            })
print(r.status_code)
print(r.text)
# Do something else with r.text, e.g. scrape values with beautifulsoup or something

【讨论】:

  • 谢谢...我尝试了您的第一个建议,但它只返回了我上面引用的相同输出...知道我在这里缺少什么吗?编辑:我还必须分配一些值但不是“检索数据”按钮......看着这个问题,我只是想知道为什么我无法访问任何表单。唯一可能的选择是 forms[0]... 为什么会这样?
【解决方案3】:

试试这个。您可以按控件类型搜索没有名称的控件。只是从记忆中去:

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

我认为这是正确的语法。我会仔细检查并确定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多