2013-12-11 47 views
-3

我有python脚本的问题。当我尝试用一​​些参数运行它,我得到以下错误:UnboundLocalError:赋值前引用的局部变量'fuzzables'

print json.dumps(filter(lambda x: x.get('url'), [x.as_dict() for x in fuzzables]), indent=4) 
UnboundLocalError: local variable 'fuzzables' referenced before assignment 

我不是一个Python的家伙;有人能帮我吗?

代码:

def main(): 
    form_stack = [] 
    parser = argparse.ArgumentParser('crawl') 
    parser.add_argument('url', type=str, help='Target URL') 
    parser.add_argument('-s', '--strict', action='store_true', help='Strict Mode') 
    args = parser.parse_args() 

    target = get_final_url(args.url) 
    ltarget = [target] 

    if args.strict: 
     br = Browser(qapp=qapp, scope=ltarget, strict_match=target) 
    else: 
     br = Browser(qapp=qapp, scope=ltarget) 

    br.load(target) 

    dom_urls = br.get_history(clear=True, verify=True) 
    static_urls = br.urls(verify=True) 
    static_urls.extend(dom_urls) 
    static_urls = list(set(static_urls)) 

    already = 0 

    for url in static_urls: 
     already += 1 
     if len(static_urls) >= 128: 
      break 

     try: 
      br.load(url, retries=2) 
     except BrowserTimeout, e: 
      continue 

     form_stack.extend(br.forms()) 
     temporaries = br.urls(verify=True) 

     map(lambda x: static_urls.append(x), temporaries) 
     dom_urls = br.get_history(clear=True, verify=True) 
     s_urls = br.urls(verify=True) 
     s_urls.extend(dom_urls) 
     s_urls = list(set(s_urls)) 
     static_urls.extend(s_urls) 
     static_urls = list(set(static_urls)) 
     static_urls = map(make_dummy_url, static_urls) 
     fuzzables, hashsums = [], [] 

     for form in form_stack: 
      if form['hashsum'] in hashsums: 
       continue 
      else: 
       hashsums.append(form['hashsum']) 

      method = form.get('method', 'POST') 
      action = form.get('action', '') 
      headers = form.get('headers') 
      cookies = form.get('cookies') 
      data = unquote(urlencode(form.get('fields', {}))) 
      action = action.toString() if type(action) != str else action 

      if type(data) == str and "__PAYLOAD__" not in data: 
       data = parse_qsl(data) 
       [data.update(set_payload(x)) for x in data.keys()] 
       data = unquote(urlencode(data)) 

      method = method.upper() 
      vhost = urlparse(action).hostname 
      fuzzable = Fuzzable(method, action, data, cookies, headers, vhost) 
      fuzzables.append(fuzzable) 

     for url in static_urls: 
      url = url.toString() if type(url) != str else url 
      uu = urlparse(url) 
      qsl = urlparse(url) 
      qsl = parse_qsl(uu.query) 

      [qsl.update(set_payload(x)) for x in qsl.keys()] 
      qsl = urlencode(qsl) 

      qq = "?%s" %qsl 
      qq = "" if qq == "?" else qq 
      url = "%s://%s%s%s" %(uu.scheme, uu.netloc, uu.path, qq) 

      if "__PAYLOAD__" not in url: 
       continue 

      cookies = br.get_plain_cookies() 
      vhost = urlparse(url).hostname 
      fields = "" 
      headers = {} 
      fuzzable = Fuzzable("GET", url, fields, cookies, headers, vhost) 
      fuzzables.append(fuzzable) 

    """ 
    fu = urlparse(target) 
    path = fu.path 
    query = parse_qsl(fu.query) 
    [query.update(set_payload(x)) for x in query.keys()] 
    query = unquote(urlencode(query)) 
    rqury = "?%s" %query 
    rqury = "" if rqury == "?" else rqury 
    temporary_url = "%s://%s%s%s" %(fu.scheme, fu.netloc, path, rqury) 
    fields = "" 
    cookies = br.get_plain_cookies() 
    vhost = urlparse(target).hostname 
    headers = {'host': fu.hostname} 
    fuzzable = Fuzzable("GET", temporary_url, fields, cookies, headers, vhost) 
    fuzzables.append(fuzzable) 
    """ 

    br.close() 
    del br 

    print json.dumps(filter(lambda x: x.get('url'), [x.as_dict() for x in fuzzables]), indent=4) 
+0

这个脚本还有更多吗?你在上面没有赋予'fuzzables'任何值。 – astex

+0

这里是 - https://github.com/zulla/ritalin,文件名ritalin_crawl.py,行154. – user3092181

回答

-1

错误消息似乎预示着问题。在使用之前,您需要指定fuzzables

例如:

fuzzables = #something 
+0

没有阅读评论主题... – astex

+0

当我回答时没有什么可读的。我的答案仍然是正确的。 – recursive

1

fuzzables在一个循环中仅被分配给:

for url in static_urls: 
    # ... 
    if len(static_urls) >= 128: 
     break 

    # ... 

    fuzzables, hashsums = [], [] 

如果static_urls是空的或包含超过128个项,该分配线从未达到,并fuzzables保持不受限制。

如果要保证绑定,请指定fuzzables外部的

扫视代码,你可能不希望创建每个static_urls进入一个新的空fuzzables无论是。

1

如果在评论中链接了脚本,如果static_urls是一个空列表,则不会对fuzzables进行任何分配,因此该变量在引用时未定义。

您可以将fuzzables = []赋值移至static_urls循环之外。

相关问题