2013-12-11 7 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 

Я не парень-питон; Кто-нибудь может мне помочь?

Код:

сообщение
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, filename 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за пределами этого цикла, если вы хотите, чтобы гарантия была связана.

Окинув этот код, вы, вероятно, не хотят создать новый пустой fuzzables для каждого static_urls записи либо.

1

С учетом сценария, связанного в комментариях, если static_urls является пустым списком, то в fuzzables присваивания не назначаются, поэтому при указании переменной не указывается.

Вы можете переместить назначение fuzzables = [] за пределы цикла static_urls.