2011-12-20 87 views
7

嗯,我正尝试使用Python和机械化登录到一个站点。使用机械化提交表单(Python)

我已经得到了网站开通:

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:还是我做错了?如果是后者,我该如何去做呢?

回答

4

使用它的名称来选择一个表格,您应该使用:

br.select_form(name="order") 

你在这里做:

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

正试图在选定的表单中为控件设置一个值,因此当他找不到它时,它会抛出您看到的异常。

+0

br.select_form(name =“username”)抛出一个错误:FormNotFoundError:没有匹配名称'username'的表单 - 与以前一样,但是这次是我刚刚添加的行。 – Matthew 2011-12-20 05:25:54

+0

你确定你有正确的名字吗?试试br.forms()中的表单:print form – tovmeod 2011-12-22 01:27:40

+0

Positive。我检查了br.forms()和原始html。 – Matthew 2011-12-27 08:12:03

0

如果通过JavaScript生成的表单你可能有几个问题

  • ,你不能用机械化解决这个问题 - 至少不以直接的方式 - 在这种情况下,我建议你试试并使用selenium - 您可以尝试查看页面HTML源代码 - 如果您在纯HTML中没有表单,则很明显它是通过javascript插入到DOM中的。另外,如果形式通过JavaScript提交,机械化不会帮你

  • 也,形式可能不会在第一页上 - 你可能需要设置机械化跟随重定向

+0

不,它不是JavaScript。我可以使用urllib访问表单...我只是想使用机械化,因为我不确定cookiejar是如何工作的,我需要保持登录> _>并且login.php是表单位置。我确信这一点。 – Matthew 2011-12-20 04:55:58