我有一段代码使用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))
但我想知道为什么我不能用之前的代码过滤它们,如果有办法直接使用列表理解来完成它。
答案 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]