我正在尝试自动登录网站http://www.tthfanfic.org/login.php。
我遇到的问题是密码字段的名称是随机生成的,我尝试过使用它的标签,类型和ID,所有这些都保持静态但无济于事。
以下是表单的HTML:
<tr>
<th><label for="urealname">User Name</label></th>
<td><input type='text' id='urealname' name='urealname' value=''/> NOTE: Your user name may not be the same as your pen name.</td>
</tr>
<tr>
<th><label for="password">Password</label></th><td><input type='password' id='password' name='e008565a17664e26ac8c0e13af71a6d2'/></td>
</tr>
<tr>
<th>Remember Me</th><td><input type='checkbox' id='remember' name='remember'/>
<label for="remember">Log me in automatically for two weeks on this computer using a cookie. </label> Do not select this option if this is a public computer, or you have an evil sibling.</td>
</tr>
<tr>
<td colspan='2' style="text-align:center">
<input type='submit' value='Login' name='loginsubmit'/>
</td>
</tr>
为了便于阅读,我试图对其进行格式化,但看起来仍然很糟糕,请考虑检查所提供页面上的代码。
以下是通过mechanize打印表单时得到的代码:
<POST http://www.tthfanfic.org/login.php application/x-www-form-urlencoded
<HiddenControl(ctkn=a40e5ff08d51a874d0d7b59173bf3d483142d2dde56889d35dd6914de92f2f2a) (readonly)>
<TextControl(urealname=)>
<PasswordControl(986f996e16074151964c247608da4aa6=)>
<CheckboxControl(remember=[on])>
<SubmitControl(loginsubmit=Login) (readonly)>>
PasswordControl中的数字序列是每次重新加载页面时更改的部分,在来自网站的HTML中,似乎有几个其他标记归于它,但当我尝试选择它们时,它们都不起作用,或者我做错了。
以下是我用来尝试按标签选择控件的代码:
fieldTwo = br.form.find_control(label='password')
br[fieldOne] = identifier
br[fieldTwo] = password
如果需要,我可以发布其余的登录代码,但这是唯一不起作用的部分,我在其他密码名称保持不变的网站上取得了成功。
那么,我可以使用它的标签,类型或ID选择passwordControl,还是需要刮掉它的名字?
编辑:糟糕,忘了添加错误消息:
raise ControlNotFoundError("no control matching "+description)
mechanize._form.ControlNotFoundError: no control matching label 'password'
求助:
一个关于reddit的人给出的解决方案,谢谢Bliti。
工作代码:
br.select_form(nr=2)
list = []
for f in br.form.controls:
list.append(f.name)
fieldTwo = list[2]
答案 0 :(得分:0)
一个关于reddit的人给出的解决方案,谢谢Bliti。
工作代码:
#Select the form you want to use.
br.select_form(nr=2)
list = []
for f in br.form.controls:
#Add the names of each item in br.formcontrols
list.append(f.name)
#Select the correct one from the list.
fieldTwo = list[2]