2012-08-10 17 views
54

Używam BeautifulSoup i parsowanie niektórych HTML-ów.Chcę, aby wyjątek obsługiwał indeks listy poza zakresem.

Otrzymuję określone dane z każdego kodu HTML (przy użyciu pętli) i dodawanie tych danych do określonej listy.

Problem polega na tym, że niektóre z HTML-ów mają inny format (i nie mają w nich danych, które w nich chcę).

Więc starałem się korzystać z obsługi wyjątków i dodać wartość null do listy (. Należy to zrobić, ponieważ sekwencja danych jest ważne)

Na przykład, mam kod jak:

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 

a niektóre z linków nie ma żadnych <dd class='title'>, więc to, co chcę zrobić, to dodać ciąg null do listy zamiast.

Błąd pojawia się:

list index out of range. 

Co mam zrobić starał się dodać kilka wierszy tak:

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

Ale to nie wyszło. Wciąż pokazuje błąd:

list index out of range. 

Co powinienem zrobić? Czy powinienem używać obsługi wyjątków? czy jest jakiś łatwiejszy sposób?

Wszelkie sugestie? Każda pomoc byłaby naprawdę świetna!

Odpowiedz

132

Handling Wyjątkiem jest do zrobienia:

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

Oczywiście można również sprawdzić len() z dlist; ale obsługa wyjątku jest bardziej intuicyjna.

+0

@JhonIntriagoThoth: Podczas gdy 'Brak' jest wyraźnie czystszy, OP chce w tym przypadku' 'null''. – ThiefMaster

24

Masz dwie opcje; albo obsłużyć wyjątek lub testować długość:

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

lub

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

wykorzystywane pierwsze, jeśli nie często ma drugi element, drugi jeśli czasami ma drugi element.

+0

dziękuję! to działa :) –

14

Trójnik jest wystarczający.zmiana:

gotdata = dlist[1] 

do

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

jest to krótki ręka dla

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

Ternary był tym, czego nie znałem! fajna wskazówka. dziękuję :) –

3

Biorąc odniesienie ThiefMaster ♦ czasami pojawia się błąd z wartością podaną jako '\ n' lub NULL i wykonaj to, co jest wymagane do obsługi błędu ValueError:

Obsługa wyjątku to sposób na przejście na

try: 
    gotdata = dlist[1] 
except (IndexError, ValueError): 
    gotdata = 'null' 
1
for i in range (1, len(list)) 
    try: 
     print (list[i]) 

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

uwaga na zakładkę, Python 3 –

1

dla któregokolwiek z zainteresowanych w krótszym sposób:

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

Ale dla uzyskania najlepszej wydajności, proponuję przy użyciu Fałsz zamiast 'null', a następnie test jedna linia wystarczą:

gotdata = len(dlist)>1 and dlist[1] 
Powiązane problemy