我正在写脚本登录网站。见下面的剧本
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
值?
答案 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。