2013-12-11 85 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循環之外。

相關問題