【问题标题】:List index out of range web crawler Python列表索引超出范围网络爬虫Python
【发布时间】:2013-12-01 04:04:43
【问题描述】:

我正在制作一个搜索所有网页的网络爬虫。我得到了http://www.someURL.com/42342 的第一个链接。在此页面上是X 表达式的行数。 parseevaluate 函数我已经将这些表达式计算为数字。使用这些数字,我将它们连接到默认链接 (http://www.someURL.com/) 以转到另一个链接。我正在尝试计算有多少网页,但我目前遇到了这个错误:

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)) 

【问题讨论】:

  • 你能发布导致问题的表达式吗?比如输入evaluate函数时print ops的输出?
  • @Liondancer 您是否希望这些 if 语句每次都触发?有没有一种情况下它们都不应该评估为真?

标签: python python-2.7 web-crawler


【解决方案1】:

如果堆栈为空,堆栈[0] 将给出该错误。

如果没有操作,堆栈将为空,是一个空行。

我想知道您的输入文件末尾是否有一两行空行。

【讨论】:

  • 嗯好吧,我会调查的
  • 嗯,链接可以显示的其他两个输出与表达式不同。这可能就是堆栈为空的原因。我忘了考虑这个谢谢!
【解决方案2】:

就像@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

【讨论】:

    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多