Ich möchte eine Ausnahmebehandlung für 'Listenindex außerhalb des Bereichs' behandeln.


106

Ich benutze BeautifulSoup und analysiere einige HTMLs.

Ich erhalte bestimmte Daten aus jedem HTML-Code (mit for-Schleife) und füge diese Daten einer bestimmten Liste hinzu.

Das Problem ist, dass einige der HTMLs ein anderes Format haben (und sie nicht die Daten haben, die ich in ihnen haben möchte) .

Also habe ich versucht, die Ausnahmebehandlung zu verwenden und nullder Liste einen Mehrwert hinzuzufügen (ich sollte dies tun, da die Reihenfolge der Daten wichtig ist.)

Zum Beispiel habe ich einen Code wie:

soup = BeautifulSoup(links)
dlist = soup.findAll('dd', 'title')
# I'm trying to find content between <dd class='title'> and </dd>
gotdata = dlist[1]
# and what i want is the 2nd content of those
newlist.append(gotdata)
# and I add that to a newlist

und einige der Links haben keine <dd class='title'>, also möchte ich nullstattdessen der Liste einen String hinzufügen .

Der Fehler erscheint:

list index out of range.

Was ich versucht habe, ist, einige Zeilen wie diese hinzuzufügen:

if not dlist[1]:  
   newlist.append('null')
   continue

Aber es klappt nicht. Es zeigt immer noch Fehler:

list index out of range.

Was soll ich dagegen tun? Soll ich die Ausnahmebehandlung verwenden? oder gibt es einen einfacheren weg?

Irgendwelche Vorschläge? Jede Hilfe wäre wirklich toll!

Antworten:


245

Die Behandlung der Ausnahme ist der richtige Weg:

try:
    gotdata = dlist[1]
except IndexError:
    gotdata = 'null'

Natürlich können Sie auch die len()von überprüfen dlist; Die Behandlung der Ausnahme ist jedoch intuitiver.


1
@JhonIntriagoThoth: Während Nonees eindeutig sauberer ist, will das OP 'null'in diesem Fall.
ThiefMaster

Tolle Lösung hier. Ich habe es in meinem Code verwendet und notiert. Vielen Dank!
Amir Yunas

31

Sie haben zwei Möglichkeiten; Behandeln Sie entweder die Ausnahme oder testen Sie die Länge:

if len(dlist) > 1:
    newlist.append(dlist[1])
    continue

oder

try:
    newlist.append(dlist[1])
except IndexError:
    pass
continue

Verwenden Sie das erste, wenn häufig kein zweites Element vorhanden ist, das zweite, wenn manchmal kein zweites Element vorhanden ist.


24

Ein Ternär wird ausreichen. Veränderung:

gotdata = dlist[1]

zu

gotdata = dlist[1] if len(dlist) > 1 else 'null'

Dies ist eine kürzere Ausdrucksweise

if len(dlist) > 1:
    gotdata = dlist[1]
else: 
    gotdata = 'null'

3

Unter Bezugnahme auf ThiefMaster ♦ erhalten wir manchmal einen Fehler mit dem Wert '\ n' oder null und führen den für ValueError erforderlichen Wert aus:

Die Behandlung der Ausnahme ist der richtige Weg

try:
    gotdata = dlist[1]
except (IndexError, ValueError):
    gotdata = 'null'

2
for i in range (1, len(list))
    try:
        print (list[i])

    except ValueError:
        print("Error Value.")
    except indexError:
        print("Erorr index")
    except :
        print('error ')

2
Vorsicht vor der Registerkarte Python 3
Gouled Med

2

für alle, die kürzer interessiert sind:

gotdata = len(dlist)>1 and dlist[1] or 'null'

Für eine optimale Leistung empfehle ich jedoch die Verwendung von False anstelle von 'null'. Dann reicht ein einzeiliger Test aus:

gotdata = len(dlist)>1 and dlist[1]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.