小能豆

我想要处理异常‘列表索引超出范围’。

javascript

我正在使用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.

我该怎么办?我应该使用异常处理吗?或者有更简单的方法吗?


阅读 33

收藏
2024-10-12

共2个答案

小能豆

出现 list index out of range 错误是因为代码尝试访问 dlist[1],即列表中的第二个元素,但 dlist 列表中可能没有足够的元素。因此,当 HTML 没有预期的 <dd class='title'> 元素时,代码会报错。

解决这个问题的两种常见方式是使用异常处理或在访问之前检查列表的长度。

解决方案 1:使用异常处理

你可以用 try-except 结构来捕获 IndexError,当没有足够的元素时,捕获这个错误并将 'null' 添加到 newlist

from bs4 import BeautifulSoup

# 假设 links 是 HTML 的列表
for link in links:
    soup = BeautifulSoup(link, 'html.parser')
    dlist = soup.findAll('dd', 'title')

    try:
        # 尝试获取第二个元素 (索引1)
        gotdata = dlist[1].get_text()
    except IndexError:
        # 如果没有第二个元素,添加 'null'
        gotdata = 'null'

    newlist.append(gotdata)

解决方案 2:检查列表长度

在尝试访问 dlist[1] 之前,可以先检查 dlist 是否包含足够的元素。这种方式避免了异常,逻辑上更加清晰。

from bs4 import BeautifulSoup

# 假设 links 是 HTML 的列表
for link in links:
    soup = BeautifulSoup(link, 'html.parser')
    dlist = soup.findAll('dd', 'title')

    # 检查列表是否有至少两个元素
    if len(dlist) > 1:
        gotdata = dlist[1].get_text()
    else:
        gotdata = 'null'

    newlist.append(gotdata)

原因:

在你的原始代码中,dlist[1] 只有在 dlist 至少有两个元素时才存在。当 HTML 中没有符合条件的 <dd class='title'> 元素时,dlist 列表为空或元素不足,因此会引发 “list index out of range” 错误。

总结:

  • 异常处理 (try-except): 捕获并处理运行时错误。
  • 长度检查: 在访问列表时,提前检查其长度。

建议使用长度检查的方法,这样可以避免不必要的异常处理,同时代码更易于理解。

2024-10-12
小能豆

处理异常是可行的方法:

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

当然你也可以检查len()dlist但是处理异常更直观。

2024-10-12