为什么创建列表时使用多种过滤方法仍然有 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]
我有一段代码使用 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]