我正在使用BeautifulSoup并解析一些 HTML。
我从每个 HTML 获取特定数据(使用 for 循环)并将该数据添加到特定列表中。
问题是,一些 HTML 具有不同的格式(并且它们没有我想要的数据)。
因此,我尝试使用异常处理并向null列表中添加值(我应该这样做,因为数据顺序很重要。)
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到列表中。
<dd class='title'>
出现错误:
list index out of range.
我所做的尝试是添加一些这样的行:
if not dlist[1]: newlist.append('null') continue
但不起作用。它仍然显示错误:
我该怎么办?我应该使用异常处理吗?或者有更简单的方法吗?
出现 list index out of range 错误是因为代码尝试访问 dlist[1],即列表中的第二个元素,但 dlist 列表中可能没有足够的元素。因此,当 HTML 没有预期的 <dd class='title'> 元素时,代码会报错。
list index out of range
dlist[1]
dlist
解决这个问题的两种常见方式是使用异常处理或在访问之前检查列表的长度。
你可以用 try-except 结构来捕获 IndexError,当没有足够的元素时,捕获这个错误并将 'null' 添加到 newlist。
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)
在尝试访问 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: gotdata = dlist[1] except IndexError: gotdata = 'null'
当然你也可以检查len();dlist但是处理异常更直观。
len()