python mechanize 处理两个具有相同名称的参数

标签 python python-2.7 authentication mechanize

我正在登录一个页面,奇怪的是,他们有一个名为 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()

最佳答案

如果你面对两个具有相同名称、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)>
>>> 

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

关于python mechanize 处理两个具有相同名称的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21035713/

相关文章:

python - 根据列值的属性值过滤 DataFrame 的行

mongodb - pymongo 游标需要很长时间才能找到

python - 获取数据框每行的第 n 个排名列 ID - Python/Pandas

authentication - 使用注释在 Servlet 3.0 中表单登录

google-chrome - Windows 身份验证在 Chrome 中不起作用

python - Django 使用替换的 Auth 模型抛出操作错误

python - Azure ML 文件数据集 mount() 速度慢且下载数据两次

UNC 路径的 Python 和 MySQL 转义序列

python - 处理 IncompleteRead,URLError

python - 在python中导入/读取csv文件,然后绘图,给出x=y图?