代码之家  ›  专栏  ›  技术社区  ›  Tomás R. Pita

为什么创建列表时,即使使用多个筛选方法,仍然没有值?

  •  2
  • Tomás R. Pita  · 技术社区  · 7 年前

    我有一段代码,使用BeautifulSoup从网页中刮取一些特定的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))
    

    但我想知道为什么我不能用前面的代码过滤它们,以及是否有一种直接使用列表理解的方法。

    3 回复  |  直到 7 年前
        1
  •  3
  •   IonicSolutions    7 年前

    问题似乎是 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]
    

    不应该再有了 没有一个 在您的列表中。如果 link 本身可以 没有一个 ,您当然也应该继续对此进行筛选。

        2
  •  0
  •   tdelaney    7 年前

    诀窍是为“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] 
    
        3
  •  0
  •   Yuankun    7 年前

    如果首先要筛选所有链接 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] 
    

    或嵌套(如果是stations)。

    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]