ฉันต้องการจัดการข้อยกเว้น 'ดัชนีรายการอยู่นอกช่วง'


108

ฉันใช้BeautifulSoupและแยกวิเคราะห์ HTML บางส่วน

ฉันได้รับข้อมูลบางอย่างจากแต่ละ HTML (ใช้สำหรับลูป)และเพิ่มข้อมูลนั้นลงในรายการบางรายการ

ปัญหาคือบางส่วนของ HTMLs มีรูปแบบที่แตกต่างกัน(และพวกเขาไม่ได้มีข้อมูลที่ฉันต้องการในพวกเขา)

ดังนั้นฉันจึงพยายามใช้การจัดการข้อยกเว้นและเพิ่มมูลค่า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.

ฉันควรทำอย่างไรกับเรื่องนี้? ฉันควรใช้การจัดการข้อยกเว้นหรือไม่? หรือมีวิธีไหนที่ง่ายกว่านี้?

ข้อเสนอแนะใด ๆ ? ความช่วยเหลือใด ๆ จะดีมาก!

คำตอบ:


250

การจัดการกับข้อยกเว้นคือหนทางที่จะไป:

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

แน่นอนคุณสามารถตรวจสอบlen()ของdlist; แต่การจัดการข้อยกเว้นนั้นง่ายกว่า


1
@JhonIntriagoThoth: ในขณะที่Noneสะอาดกว่าอย่างชัดเจน OP ต้องการ'null'ในกรณีนี้
ThiefMaster

ทางออกที่ดีที่นี่ ฉันใช้มันในรหัสของฉันและจดบันทึกไว้ ขอบคุณ!
Amir Yunas

32

คุณมีสองทางเลือก จัดการข้อยกเว้นหรือทดสอบความยาว:

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

หรือ

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

ใช้รายการแรกหากมักไม่มีรายการที่สองรายการที่สองหากบางครั้งไม่มีรายการที่สอง


24

คนเรียนจะพอเพียง เปลี่ยนแปลง:

gotdata = dlist[1]

ถึง

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

นี่เป็นวิธีการแสดงออกที่สั้นกว่า

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

3

การอ้างอิง ThiefMaster ♦บางครั้งเราได้รับข้อผิดพลาดพร้อมค่าที่กำหนดเป็น '\ n' หรือ null และดำเนินการตามที่จำเป็นเพื่อจัดการกับ ValueError:

การจัดการกับข้อยกเว้นคือหนทางที่จะไป

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


2

สำหรับใครที่สนใจวิธีที่สั้นกว่านี้:

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

แต่เพื่อประสิทธิภาพที่ดีที่สุดฉันขอแนะนำให้ใช้Falseแทนจาก'null'นั้นการทดสอบบรรทัดเดียวก็เพียงพอแล้ว:

gotdata = len(dlist)>1 and dlist[1]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.