You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:31