2016-07-01 16 views
1

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!

Antwort

3

Der erste Schritt beim Debuggen ist, die komplexe Zeile zu nehmen, die einen Fehler verursacht und es einfacher macht. Sie können dann die Zwischenwerte untersuchen, um zu sehen, ob die Annahmen, die Sie über den Code treffen, wahr sind. In diesem Fall ist Ihre Annahme, dass soup.find_all('table', ...) tatsächlich etwas findet.

Zum Beispiel ändern diese:

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

dazu:

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

nächstes eine print-Anweisung hinzufügen tmp zu untersuchen:

print("tables is", tables) 

Sie werden feststellen, dass tables ist wahrscheinlich leer, also wenn Sie versuchen, tables[0] zu tun, erhalten Sie ein äh ror seit Index 0 ist außerhalb des Bereichs.

+0

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

+0

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

+0

@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. –

Verwandte Themen