即使使用多种过滤方法,为什么在创建列表时仍然具有None值?

时间:2018-04-20 16:13:04

标签: python list filter nonetype

我有一段代码使用beautifoulsoup从网页中抓取一些特定的网址并将它们存储在列表中,我尝试一次性过滤None值,我使用了以下替代方法:

1

list_links = [link.get('data-href') for link in BSOBJ.find_all('a') if link is not None] 

2

list_links = [link.get('data-href') for link in BSOBJ.find_all('a') if link != None] 

在他们两个中我仍然得到None值,在创建列表后我用这行删除它们:

list_links = list(filter(None, list_links))

但我想知道为什么我不能用之前的代码过滤它们,如果有办法直接使用列表理解来完成它。

3 个答案:

答案 0 :(得分:3)

问题似乎是link.get('data-href)有时会返回None。为了捕获这些情况,请使用

list_links = [link.get('data-href') for link in BSOBJ.find_all('a') if link.get('data-href') is not None]

并且列表中不应再有None个。如果link本身可以是None,那么您当然也应该对此进行过滤。

答案 1 :(得分:0)

诀窍是为" data-href"写一个生成器。值,然后在外部列表理解中过滤。

list_links = [lnk 
    for lnk in (link.get('data-href') for link in BSOBJ.find_all('a'))
    if lnk is not None] 

更好的是,如果网页具有None属性,则丢弃所有空链接而不是data=href=""

list_links = [lnk 
    for lnk in (link.get('data-href') for link in BSOBJ.find_all('a'))
    if lnk] 

答案 2 :(得分:0)

如果您首先要过滤所有None的链接,然后想要过滤None函数生成的link.get(),那么这可以使用嵌套列表理解。

list_links = [l for l in [link.get('data-href') for link in BSOBJ.find_all('a') if link is not None] if l is not None] 

或嵌套if statments。

list_links = [link.get('data-href') for link in BSOBJ.find_all('a') if link is not None if link.get('data-href') is not None]