2012-08-10 92 views
54

我正在使用BeautifulSoup並解析了一些HTML。我想異常處理'列表索引超出範圍'。

我從每個HTML (使用for循環)獲得某些數據並將該數據添加到某個列表。

問題是,一些HTML有不同的格式(並且他們沒有我想要的數據)

所以,我嘗試使用異常處理和增值null到列表(我應該這樣做,因爲數據的順序很重要)

舉例來說,我有這樣一個代碼:

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 

和某些環節沒有任何<dd class='title'>,所以我想要做的就是添加字符串null到列表來代替。

出現錯誤:

list index out of range. 

我所做的嘗試是添加一些行是這樣的:

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

但它不工作了。它仍然顯示錯誤:

list index out of range. 

該怎麼辦?我應該使用異常處理嗎?或者有沒有更簡單的方法?

有什麼建議嗎?任何幫助都會非常棒!

回答

132

處理異常是要走的路:

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

當然,你也可以查看dlistlen();但處理異常更直觀。

+0

@JhonIntriagoThoth:雖然'None'顯然更清潔,但OP在這種情況下希望'null'。 – ThiefMaster 2017-10-27 12:25:23

24

你有兩個選擇;任一處理異常或測試長度:

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

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

使用第一個,如果有往往沒有第二項,所述第二如果有有時是沒有第二項。

+0

謝謝!這工作:) – 2012-08-10 16:08:38

14

三元組就足夠了。變化:

gotdata = dlist[1] 

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

這是

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

三元是我不知道!不錯的提示。謝謝:) – 2012-08-10 16:08:05

3

以ThiefMaster♦參考的手短,有時我們得到一個錯誤,給定爲 '\ n' 或空值並執行處理ValueError所需的操作:

處理異常是要走的路

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

小心標籤, Python 3 – 2016-06-21 12:19:26

1

爲有興趣在更短的方式之一:

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

但爲了獲得最佳性能,我建議使用虛假的,而不是「空」,然後是一個在線測試就足夠了:

gotdata = len(dlist)>1 and dlist[1]