Tôi muốn xử lý ngoại lệ 'chỉ mục danh sách nằm ngoài phạm vi.'


107

Tôi đang sử dụng BeautifulSoup và phân tích cú pháp một số HTML.

Tôi đang nhận một dữ liệu nhất định từ mỗi HTML (sử dụng vòng lặp for) và thêm dữ liệu đó vào một danh sách nhất định.

Vấn đề là, một số HTML có định dạng khác nhau (và chúng không có dữ liệu mà tôi muốn trong đó) .

Vì vậy, tôi đang cố gắng sử dụng xử lý ngoại lệ và thêm giá trị nullvào danh sách (tôi nên làm điều này vì chuỗi dữ liệu là quan trọng.)

Ví dụ, tôi có một mã như:

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

và một số liên kết không có bất kỳ liên kết nào <dd class='title'>, vì vậy những gì tôi muốn làm là thêm chuỗi nullvào danh sách.

Lỗi xuất hiện:

list index out of range.

Những gì tôi đã thử là thêm một số dòng như thế này:

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

Nhưng nó không diễn ra. Nó vẫn hiển thị lỗi:

list index out of range.

Tôi nên làm gì với cái này? Tôi có nên sử dụng xử lý ngoại lệ không? hoặc có cách nào dễ dàng hơn không?

Bất kỳ đề xuất? Bất kỳ trợ giúp sẽ thực sự tuyệt vời!

Câu trả lời:


246

Xử lý ngoại lệ là cách để thực hiện:

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

Tất nhiên bạn cũng có thể kiểm tra len()các dlist; nhưng xử lý ngoại lệ trực quan hơn.


1
@JhonIntriagoThoth: Trong khi Nonerõ ràng là sạch hơn, OP muốn 'null'trong trường hợp này.
ThiefMaster

Giải pháp tuyệt vời ở đây. Tôi đã sử dụng nó trong mã của mình và ghi chú lại nó. Cảm ơn!
Amir Yunas

31

Bạn có hai lựa chọn; hoặc xử lý ngoại lệ hoặc kiểm tra độ dài:

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

hoặc là

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

Sử dụng cái đầu tiên nếu thường không có món thứ hai, cái thứ hai nếu đôi khi không có món thứ hai.


24

Một con ba ba là đủ. thay đổi:

gotdata = dlist[1]

đến

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

đây là một cách diễn đạt ngắn hơn

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

3

Tham chiếu đến ThiefMaster ♦ đôi khi chúng tôi gặp lỗi với giá trị được cho là '\ n' hoặc null và thực hiện theo yêu cầu đó để xử lý ValueError:

Xử lý ngoại lệ là cách để đi

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
hãy cẩn thận của tab, Python 3
Gouled Med

2

Đối với bất kỳ ai quan tâm đến một cách ngắn hơn:

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

Nhưng để có hiệu suất tốt nhất, tôi khuyên bạn nên sử dụng Falsethay vì 'null', sau đó kiểm tra một dòng sẽ đủ:

gotdata = len(dlist)>1 and dlist[1]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.