使用BeautifulSoup遇IndexError: list index out of range错误求助
解决IndexError: list index out of range的问题
嘿,我一眼就看到你的问题出在哪了!你现在的异常处理完全没命中实际抛出的错误,咱们一步步理清楚:
问题根源
你代码里捕获的是ValueError,但实际触发的错误是IndexError——当titlecontain是空列表时,你去访问titlecontain[0]就会抛出这个索引越界错误。这就好比你准备接一个苹果,结果扔过来的是橘子,你手里的苹果筐自然接不住。
为什么titlecontain会是空的?因为页面上有些item_infos区块里并没有item_title这个h2标签,find_all()找不到匹配元素时就会返回空列表。
两种解决方法
方法1:修正异常捕获类型
把你捕获的异常改成IndexError,这样就能精准捕捉到索引越界的情况了:
#Import lib needed from urllib.request import urlopen as uReq from bs4 import BeautifulSoup as soup #-----------------------------------------Importing data -----------------------------------------------------------------# #Page with number of adds per location my_url_nb_Nimes_building = 'https://www.leboncoin.fr/ventes_immobilieres/offres/?th=1&q=immeuble&it=1&location=N%EEmes&ret=1&ret=2&ret=5' #Opening connection, grabbing the page, close connection uClientnimesbuild = uReq(my_url_nb_Nimes_building) page_htmlnimesbuild = uClientnimesbuild.read() uClientnimesbuild.close() page_soupnimesbuild = soup(page_htmlnimesbuild, "html.parser") containglobalnbnimesbuild = page_soupnimesbuild.find_all("section",{"class":"item_infos"}) count = 0 for contain in containglobalnbnimesbuild: try: titlecontain = contain.find_all("h2",{"class":"item_title"}) title = titlecontain[0] print("Titre:", title) count = count +1 print(count) except IndexError: # 这里改成IndexError print("找不到标题,跳过当前区块")
方法2:提前判断列表长度(更推荐)
与其等异常抛出再处理,不如先检查titlecontain是否有内容,这样代码逻辑更清晰:
#Import lib needed from urllib.request import urlopen as uReq from bs4 import BeautifulSoup as soup #-----------------------------------------Importing data -----------------------------------------------------------------# #Page with number of adds per location my_url_nb_Nimes_building = 'https://www.leboncoin.fr/ventes_immobilieres/offres/?th=1&q=immeuble&it=1&location=N%EEmes&ret=1&ret=2&ret=5' #Opening connection, grabbing the page, close connection uClientnimesbuild = uReq(my_url_nb_Nimes_building) page_htmlnimesbuild = uClientnimesbuild.read() uClientnimesbuild.close() page_soupnimesbuild = soup(page_htmlnimesbuild, "html.parser") containglobalnbnimesbuild = page_soupnimesbuild.find_all("section",{"class":"item_infos"}) count = 0 for contain in containglobalnbnimesbuild: titlecontain = contain.find_all("h2",{"class":"item_title"}) if len(titlecontain) > 0: # 先判断列表是否非空 title = titlecontain[0] print("Titre:", title) count = count +1 print(count) else: print("找不到标题,跳过当前区块")
额外优化建议
其实你可以用find()代替find_all(),find()会直接返回第一个匹配的元素,找不到就返回None,代码会更简洁:
for contain in containglobalnbnimesbuild: title = contain.find("h2",{"class":"item_title"}) if title is not None: print("Titre:", title) count +=1 print(count) else: print("找不到标题,跳过当前区块")
这样就完全避免了列表索引的问题,逻辑也更直观!
内容的提问来源于stack exchange,提问作者huifortrack
相关产品推荐
相关产品推荐

