2013-12-01 7 views
0

Я делаю веб-гусеничный хостинг, который исчерпывает каждую веб-страницу. Мне дается первая ссылка http://www.someURL.com/42342. На этой странице X количество строк выражений. Функции parse и evaluate Я оценил эти выражения для чисел. С этими числами я объединяю их по умолчанию (http://www.someURL.com/), чтобы перейти к другой ссылке. Я стараюсь, чтобы подсчитать, сколько веб-страниц Есть, но я в настоящее время работает в эту ошибку:Список индексов вне диапазона веб-искатель Python

Traceback (most recent call last): 
    File "test2.py", line 72, in <module> 
    print url_queue(convert_to_link(URL)) 
    File "test2.py", line 23, in url_queue 
    new_urls = convert_to_link(url) 
    File "test2.py", line 13, in convert_to_link 
    num_list.append(evaluate(parse(expressions))) 
    File "test2.py", line 62, in evaluate 
    return stack[0] 
IndexError: list index out of range 

Я не совсем уверен, почему. Кажется, что каждая функция дает правильный результат. Может ли кто-нибудь помочь указать, где моя логика неправильна в моем коде?

Мой код:

import urllib2 

URL = 'http://www.someURL.com/42342' 

def convert_to_link(url):  
    req = urllib2.Request(url) 
    response = urllib2.urlopen(req) 
    output_expressions = response.read().splitlines() #return each expression in a list 
    num_list = [] 
    url_list = [] 
    for expressions in output_expressions: 
     num_list.append(evaluate(parse(expressions))) 
    for number in num_list: 
     url_list.append(newpage_gen(number)) 
    return url_list 

def url_queue(url_list): 
    count = 0 
    for url in url_list: 
     new_urls = convert_to_link(url) 
     url_list.extend(new_urls) 
     count += 1 
    return count 

def parse (s):   # parse expression 
    s = s.replace('(', ' ').replace(')', ' ').replace(',', ' ') 
    return s.split()[::-1] 

def evaluate (ops):  # evaluate expression 
    stack = [] 
    while ops: 
     op = ops[0] 
     ops = ops[1:] 
     try: 
      stack.append(int(op)) 
      continue 
     except: pass 
     if op == 'add': 
      arg1, arg2 = stack.pop(), stack.pop() 
      stack.append(arg1 + arg2) 
      continue 
     if op == 'multiply': 
      arg1, arg2 = stack.pop(), stack.pop() 
      stack.append(arg1 * arg2) 
      continue 
     if op == 'abs': 
      arg1 = stack.pop() 
      stack.append(abs(arg1)) 
      continue 
     if op == 'subtract': 
      arg1, arg2 = stack.pop(), stack.pop() 
      stack.append(arg1 - arg2) 
      continue 
    return stack[0] 

def newpage_gen(page_num):  # create new link 
    url_template = 'http://www.someURL.com/' 
    new_url = url_template + str(page_num) 
    return new_url 

print "TESTING" 
print url_queue(convert_to_link(URL)) 
+1

Можете ли вы опубликовать выражение, которое вызывает проблему? Например, вывод 'print ops', когда вы вводите функцию оценки? – perreal

+0

@ Liondancer Ожидаете ли вы, что инструкции if запускаться каждый раз? Есть ли сценарий, когда ни один из них не должен оцениваться как истинный? – fdsa

ответ

1

Если стек пуст, стек [0] даст эту ошибку.

Стек не будет пустым, если нет операций, это пустая строка.

Мне было бы интересно, есть ли у вашего входного файла пустая строка или две в конце его.

+0

hmm okay Я рассмотрю, что – Liondancer

+0

Ну есть два других выхода, которые может отображать ссылка, которые отличаются от выражений. Вероятно, поэтому пул пуст. Я забыл учитывать это спасибо! – Liondancer

1

Как @Hugh Bothwell сказал, что стек, вероятно, пуст. Попробуйте заменить код таким образом, чтобы определить ошибку:

if op == 'add': 
     arg1, arg2 = stack.pop(), stack.pop() 
     stack.append(arg1 + arg2) 
     continue 
else if op == 'multiply': 
     arg1, arg2 = stack.pop(), stack.pop() 
     stack.append(arg1 * arg2) 
     continue 
else if op == 'abs': 
     arg1 = stack.pop() 
     stack.append(abs(arg1)) 
     continue 
else if op == 'subtract': 
     arg1, arg2 = stack.pop(), stack.pop() 
     stack.append(arg1 - arg2) 
     continue 
else: 
     print "UNEXPECTED INPUT!!"+op 
Смежные вопросы