2011-02-08 52 views
2

我正在连接一个页面,需要登录与机械化。它在头版上使用了一些JavaScript,使得使用机械化直线更困难。我知道我必须提交什么表单来登录 - 总是由js生成的表单,每次都是一样的。我怎样才能使机械化只是提交不在页面上的自定义表单?基本上相当于this perl problem,但在Python中。蟒蛇机械化 - 提交自定义表格

回答

5

(注:此想出了最近一次事实上,我现在的工作)

这似乎工作:

br.open(URL) 
res = mechanize._form.ParseString(FORM_HTML, BASE_URL) 
br.form = res[1] 
#continue as if the form was on the page and selected with .select_form() 
br['username'] = 'foo' 
br['password'] = 'bar' 
br.submit() 

URL是访问的网站的完整URL。 BASE_URL是URL是在目录中。FORM_HTML是具有form元素的任何HTML,例如:

<form method='post' action='/login.aspx'> 
    <input type='text' name='username'> 
    <input type='text' name='password'> 
    <input type='hidden' name='important_js_thing' value='processed_with_python TM'> 
</form> 

出于某种原因,mechanize._form.ParseString回报两种形式。第一个请求是对基本URL的GET请求,没有输入;第二,从FORM_HTML正确解析的形式。

+1

老兄,如果可以的话,我会给你+100。你怎么解决这个问题的?网络上的其他人都没有提出这个问题,许多人被迫放弃了这个解决方案。 – 2013-05-21 20:17:33

0

解析页面,提取你想要的元素,改造页面,并将它们注入机械化。

对于我工作的项目,我不得不使用模拟浏览器,发现机械化在表单处理上非常差。它会从JavaScript块中抽取未解释的元素并死亡。我不得不写一个解决方法,使用BeautifulSoup去除所有可能导致它在到达表单解析器之前死掉的位。

您可能会也可能不会遇到这个问题,但需要牢记。我最终放弃了机械化方法,并与Selenium一起前往。它的表单处理程序是非常优越的,它可以处理JS。它有问题(浏览器增加了一层复杂性),但我发现它更容易处理。