TypeError:期望的BaseHandler实例,得到<type'str'=“”> </type>

时间:2012-10-29 11:37:15

标签: python

import urllib2, re, urllib

def login():
    host = "http://localhost/cms/"
    user = 'admin'
    passw = 'admin'
    error = "Login to CMS Made Simple"
    form = [
        ('username', user),
        ('password', word)]   
    target = host + "/admin/login.php"
    login_form_data = urllib.urlencode(form)
    opener = urllib2.build_opener(target)
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    source = opener.open(target, login_form_data).read()
    if re.search(error, source) == None : 
        print 'FOund =>>>' + target + 'Username : ' + user + 'Password :  ' + word
    else: 
        print 'Not Found=>> ' + target + '  Username : ' + user + 'Password :  ' + word

login()

我得到了这个:

    opener = urllib2.build_opener(host)
  File "D:\Python27\lib\urllib2.py", line 486, in build_opener
    opener.add_handler(h)
  File "D:\Python27\lib\urllib2.py", line 322, in add_handler
    type(handler))
TypeError: expected BaseHandler instance, got <type 'str'>

我认为问题在于:opener = urllib2.build_opener(target)

但是如何解决呢?我尝试了很多。

2 个答案:

答案 0 :(得分:0)

关于urllib2.build_opener的{​​{3}}:

  

处理程序可以是BaseHandler的实例,也可以是子类   BaseHandler(在这种情况下,必须可以调用构造函数   没有任何参数)。

您尝试传递str

target=host+"/admin/login.php"
... 
opener = urllib2.build_opener(target)

尝试使用简化API的docs库来获取网址。

答案 1 :(得分:0)

如果您只是删除该行,它将起作用; build_opener不需要参数,除非您希望它执行特定的操作。在这种情况下,如果服务器希望使用cookie来保持您的登录状态,则可能需要添加CookieProcessor。

cjar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cjar)