使用Mechanize提交表单(Python)
我正在尝试用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'
试图给选中的表单下的一个控件设置一个值,所以当找不到这个控件时,就会出现你看到的那个错误。