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
超出范围。
我正在 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
超出范围。