如何在python中使用mechanize确定nr值

时间:2015-08-19 10:17:54

标签: python mechanize

我正在写脚本登录网站。见下面的剧本

import mechanize
browser = mechanize.Browser()

print "Login to myweb"

browser.open('https://www.example.com/index.php/devicelogin')

#Login page. Give user credentials 
browser.select_form(nr=0)
browser.form["username"] = 'username'
browser.form["passwd"] = 'password'
browser.submit()

html = browser.response().read()

print html

当我运行它时,它会给我错误。

Login to myweb
Traceback (most recent call last):
  File "test.py", line 10, in <module>
  browser.form["username"] = 'username'
  File "build\bdist.win32\egg\mechanize\_form.py", line 2780, in __setitem__
  File "build\bdist.win32\egg\mechanize\_form.py", line 3101, in find_control
  File "build\bdist.win32\egg\mechanize\_form.py", line 3185, in _find_control
mechanize._form.ControlNotFoundError: no control matching name 'username'

现在如果我在nr=1中更改browser.select_form(nr=0),那么它可以正常工作。

那么我如何确定nr值?

1 个答案:

答案 0 :(得分:1)

来自mechanize settings

  

nr,如果提供,则是表单的序号(其中0是           第一)。

所以页面中的第一个表格是0,第二个表格是1,第三个是2,等等。

但是,如果您无法通过计算表单来确定表单的编号,并且表单没有名称,则可以执行以下操作:

for n in range(len(browser.forms())):
   browser.select_form(nr=n)
   try:
       browser.form["username"] = 'username'
       browser.form["passwd"] = 'password'
       browser.submit()
   except mechanize._form.ControlNotFoundError:
       continue  # check next form
   break 

html = browser.response().read()      

如果是命名表单,您可以跳过所有计数并通过调用browser.select_form('my_form_name')

来检索它

最后,如果您的表单没有名称属性,并且您不想遍历表单,那么您可能需要查看source code,它会为您提供像使用BeautifulSoup一样浏览文档的可能性(因为它是基于它构建的)和类似Mechanize的API。