Ich mache ein GUI-basiertes Projekt in Python mit dem Modul tkinter. Es holt grundlegende Daten von Online-Richter, zB SPOJ mit Beautiful Soup. Ich bin ein Neuling in Python, also die meisten der Dinge, die ich geschrieben habe, ist mit grundlegenden Tutorials aus dem Internet. Für ein bestimmtes Stück Code stehe ich jedoch total fest.IndexError: Listenindex außerhalb des Bereichs in einer Funktion mit BeautifulSoup
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.')
Dieser Teil des Code funktioniert gut, wenn ich es mit Python submissions.py laufe
Nach diesem Teil zu testen, versuche ich es in den größeren Code zu integrieren, wo das Problem auftritt. Ich bin auch hier der entsprechende Abschnitt des Codes:
In 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)
In 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")
Aber das Problem der Indexerror tritt in stats.py
in der Leitung :
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
Ich kann nicht verstehen, warum der Code hier nicht funktioniert. Bitte helfen Sie!
Ich habe versucht, den Ansatz, den Sie vorgeschlagen haben, und das gleiche Problem gefunden, dass die Tabellen leer ist. Aber von der HTML-Datei weiß ich, dass die Tabellen nicht leer sein sollten. Und das gleiche wird bestätigt, wenn ich diesen Teil des Codes getrennt ausführe, gibt er die Antwort 3138, d. H. Die Anzahl der gelösten Probleme, und in diesem Fall auch die Anzahl der td-Tags. Daher die Verwirrung. Warum verhält sich das gleiche Stück Code anders? – Neha
Aus dem gleichen Grund habe ich den vollständigen Code, den ich separat ausführen und die Antwort bekommen. Damit andere es auch ausführen und überprüfen können. Aber sobald ich es in die Funktion einfüge, zeigt es den Fehler des Index außerhalb der Grenzen an. – Neha
@Neha: Wenn Sie verschiedene Ausgaben erhalten, geben Sie wahrscheinlich verschiedene Eingaben. Haben Sie Ihre Annahme bestätigt, dass Sie in allen Fällen dieselben Eingaben angeben - nicht nur die gleichen Variablennamen, sondern den tatsächlichen Inhalt der Variablen? Vielleicht ist 'Benutzername' nicht das, was du denkst. –