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

Why do I still have None values when I create a list even when using multiple filtering methods?

我有一段代码使用 beautifoulsoup 从网页中抓取一些特定的 url 并将它们存储在列表中,我尝试一劳永逸地过滤 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))

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

问题似乎是 link.get('data-href) 有时 returns 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,你当然也应该继续过滤。

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

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

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

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

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

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 语句。

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]