133

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

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

有什么建议么?任何帮助都会非常棒!

4

6 回答 6

314

处理异常是要走的路:

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

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

于 2012-08-10T13:17:13.787 回答
44

你有两个选择;处理异常或测试长度:

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

或者

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

如果经常没有第二个项目,则使用第一个,如果有时没有第二个项目,则使用第二个。

于 2012-08-10T13:17:43.590 回答
28

三元组就足够了。改变:

gotdata = dlist[1]

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

这是一种更短的表达方式

if len(dlist) > 1:
    gotdata = dlist[1]
else: 
    gotdata = 'null'
于 2012-08-10T13:22:06.253 回答
4

对于任何对较短方式感兴趣的人:

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

但是为了获得最佳性能,我建议使用False而不是'null',那么单行测试就足够了:

gotdata = len(dlist)>1 and dlist[1]
于 2017-08-16T09:30:51.523 回答
3

参考 ThiefMaster♦ 有时我们会得到一个错误,其值为 '\n' 或 null 并执行处理 ValueError 所需的错误:

处理异常是要走的路

try:
    gotdata = dlist[1]
except (IndexError, ValueError):
    gotdata = 'null'
于 2015-01-10T07:12:33.077 回答
0
for i in range (1, len(list))
    try:
        print (list[i])

    except ValueError:
        print("Error Value.")
    except indexError:
        print("Erorr index")
    except :
        print('error ')
于 2016-06-21T12:16:02.950 回答