IndexError: list index out of range in a function using BeautifulSoup

IndexError: list index out of range in a function using BeautifulSoup

我正在 Python 中使用模块 tkinter 创建一个基于 GUI 的项目。它从在线判断中获取基本数据,例如,使用 Beautiful Soup 的 SPOJ。我是 Python 的新手,所以我写的大部分内容都是来自互联网的基础教程。然而,对于一段特定的代码,我完全被卡住了。

import sys
import urllib.request
from bs4 import BeautifulSoup 
import re

userName = 'xilinx'
spojUrl = 'http://www.spoj.com/users/'+userName

with urllib.request.urlopen(spojUrl) as x:
   html = x.read()
soup = BeautifulSoup(html, 'html.parser')
# li - list of successful submissions
li = soup.find_all('table', class_='table table-condensed')[0].find_all('td')
listOfSolvedProblemCodes = []
    for submission in li:
        problemCode = submission.get_text()
        if problemCode:
            listOfSolvedProblemCodes.append(problemCode)
print (userName+ ' has solved',len(listOfSolvedProblemCodes),'problems on Spoj.')

当我 运行 使用 python submissions.py

时,这部分代码工作正常

测试这部分后,我尝试将其合并到出现问题的较大代码中。我在这里包括代码的相关部分:

在frame.py中:

def compStats ():
    if ch == "SPOJ":
        stats.show(ch, userName)

B2 = tkinter.Button(root, text="My Statistics", command=compStats)
B2.place(anchor = W, x = 30, y = 220, width=200)

在stats.py中:

def show(ch, userName):

    if ch == 'SPOJ':

        spojUrl = 'http://www.spoj.com/users/'+userName

        with urllib.request.urlopen(spojUrl) as x:
            html = x.read()
        soup = BeautifulSoup(html, 'html.parser')
        li = soup.find_all('table', class_='table table-condensed')[0].find_all('td')
        listOfSolvedProblemCodes = []
        for submission in li:
            problemCode = submission.get_text()
            if problemCode:
                listOfSolvedProblemCodes.append(problemCode)


    # then collect more information from soup and print it through labels in another window

    det = tkinter.Tk()
    det.title("Statistics")
    det.geometry("800x600")

但是IndexError的问题出现在stats.py行:

li = soup.find_all('table', class_='table table-condensed')[0].find_all('td')

Exception in Tkinter callback

Traceback (most recent call last):

File "C:\Users\Aa\AppData\Local\Programs\Python\Python35-32\lib\tkinter__init .py", line 1550, in __call

return self.func(*args)

File "frame.py", line 34, in compStats

stats.show(ch, userName)

File "C:\Users\Aa\AppData\Local\Programs\Python\Python35-32\stats.py", line 17, in show

li = soup.find_all('table', class_='table table-condensed')[0].find_all('td')

IndexError: list index out of range

我无法理解为什么代码无法在此处运行。请帮忙!

调试的第一步是将抛出错误的复杂行简化。然后您可以检查中间值,看看您对代码所做的假设是否正确。在这种情况下,您的假设是 soup.find_all('table', ...) 实际上正在寻找一些东西。

例如,更改为:

li = soup.find_all('table', class_='table table-condensed')[0].find_all('td')

对此:

tables = soup.find_all('table', class_='table table-condensed')
li = tables[0].find_all('td')

接下来,添加一个打印语句来检查tmp:

print("tables is", tables)

您会发现 tables 可能是空的,因此当您尝试执行 tables[0] 时会出现错误,因为索引 0 超出范围。