使用Mechanize提交表单(Python)

8 投票
2 回答
13005 浏览
提问于 2025-04-17 08:41

我正在尝试用Python和mechanize登录一个网站。

我已经打开了这个网站:

site = br.open("http://example.com/login.php")

而且我得到了这个网站上的表单列表(通过br.forms)。

<GET http://example.com/search.php application/x-www-form-urlencoded
<HiddenControl(search=1) (readonly)>
...
<POST http://example.com/login.php application/x-www-form-urlencoded
<TextControl(username=)>
<PasswordControl(password=)>
<CheckboxControl(stay=[1])>
<SubmitControl(<None>=Log in) (readonly)>>

我一直在尝试提交用户名和密码的字段。

我试着这样做:

br.select_form(nr=0)
br.form["username"] = 'usernamehere'
br.form["password"] = 'passwordhere'
br.submit()

然后我意识到我尝试填写的表单并不是页面上的第一个,但把0改成其他数字也没有帮助。我该怎么选择这个页面上的表单呢?

不过!这并不是唯一的问题。

当我运行代码时,我遇到了这个错误:

Traceback (most recent call last):
File "C:\Python26\login.py", line 34, in <module>
br.form["username"] = 'usernamehere'
...
ControlNotFoundError: no control matching name 'username'

我该怎么解决这个问题?D: 还是说我完全搞错了?如果是后者,我该怎么做呢?

2 个回答

0

你可能会遇到几个问题:

  • 如果这个表单是通过JavaScript生成的,你就不能用mechanize来解决这个问题——至少不是简单的方法。在这种情况下,我建议你试试selenium。你可以查看页面的HTML源代码,如果你在纯HTML中找不到这个表单,那就很明显它是通过JavaScript插入到页面中的。而且,如果表单是通过JavaScript提交的,mechanize也帮不了你。

  • 另外,表单可能不在第一页——你可能需要设置mechanize去跟踪重定向。

4

要通过名字选择一个表单,你应该使用:

br.select_form(name="order")

你在这里做的事情是:

br.form["username"] = 'usernamehere'

试图给选中的表单下的一个控件设置一个值,所以当找不到这个控件时,就会出现你看到的那个错误。

撰写回答