【问题标题】:python mechanize handle two parameters with same namepython mechanize 处理两个同名参数
【发布时间】:2014-01-28 22:02:24
【问题描述】:

我正在登录一个页面,其中奇怪地有一个名为 login_email 的表单输入和两个名为 login_password 的表单输入。我需要设置两者的值,但直接调用 form['login_password'] 会引发错误:

  File "/Library/Python/2.7/site-packages/mechanize/_form.py", line 3101, in find_control
    return self._find_control(name, type, kind, id, label, predicate, nr)
  File "/Library/Python/2.7/site-packages/mechanize/_form.py", line 3183, in _find_control
    raise AmbiguityError("more than one control matching "+description)
mechanize._form.AmbiguityError: more than one control matching name 'login_password'

我只需要想办法同时提交form['login_password'] = "Password"form['login_password'] = "monkeybutler"。我没有在 Browser 对象中看到用于更改 POST 数据参数的变量。

有什么建议吗? 这是我尝试但没有成功的方法:

# Select the first (index zero) form
br.select_form(nr=0)

# Let's search
br.form['login_email'] = 'mommajane@gmail.com'

#my_fields = br.form.fields.select
#my_fields[0].login_password = "Password"
#my_fields[1].login_password = "123qwerty"
br.form['login_password']= ['Password','123qwerty']

br.submit()

【问题讨论】:

    标签: python python-2.7 login mechanize


    【解决方案1】:

    如果您面对两个具有相同名称、id 等的字段,则必须使用一些解决方法,尽管它不是很干净

    首先我为该示例定义了一个简单的 html 文件,因为我不知道您使用的 URL:

        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
           "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <title>foo</title>
    </head>
    <body>
    
    <h1>bar</h1>
    
    <form action="input_text.htm">
      <p>name:<br><input name="name" type="text" size="30" maxlength="30"></p>
      <p>sec_name:<br><input name="sec_name" type="text" size="30" maxlength="40"></p>
      <p>sec_name:<br><input name="sec_name" type="text" size="30" maxlength="40"></p>
    </form>
    
    </body>
    </html>
    

    之后,我可以使用以下 python 代码快速而肮脏地向这些字段中插入值:

    >>> import mechanize
    >>> browser = mechanize.Browser()
    >>> browser.open("file:///home/foo/index.html")
    <response_seek_wrapper at 0x229a7e8 whose wrapped ...
    >>> browser.select_form(nr=0)
    >>> name = 'foo'
    >>> for control in browser.form.controls:
    ...     if control.name == 'sec_name':
    ...             control.value = name
    ...             name = 'bar'
    ... 
    >>> for control in browser.form.controls:
    ...     print control
    ... 
    <TextControl(name=)>
    <TextControl(sec_name=foo)>
    <TextControl(sec_name=bar)>
    >>> 
    

    这不是很好,但它有效。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多