You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python列表过滤:空列表与TypeError问题求助

问题分析与解决:BeautifulSoup抓取列表过滤报错问题

问题背景

作为Python初学者,使用BeautifulSoup抓取网页得到lista_aziende_raw列表,确认列表中存在包含'Azienda'的元素,但两种过滤方式均出现异常:

  • 使用列表推导式过滤时得到空列表
  • 使用自定义函数+if语句过滤时,抛出TypeError: argument of type 'NoneType' is not iterable错误

第一段测试代码及报错

lista_aziende_raw = []

for link in soup.find_all('a'):
    lista_aziende_raw.append(link.get('href'))

parsing_name = ['Azienda']

for link in soup.find_all('a'):
    lista_aziende_raw.append(link.get('href')) 

print(lista_aziende_raw)

lista_aziende_filtered = [x for x in lista_aziende_raw if x in parsing_name] 

print(lista_aziende_filtered)

对应报错:

File "/home/enrico/Documents/Learning_Python/edo/web_scraper.py", line 41, in <listcomp>
    lista_aziende_filtered = [x for x in lista_aziende_raw if x in parsing_name] 
                                                              ^^^^^^^^^^^^^^^^^
TypeError: 'in <string>' requires string as left operand, not NoneType

第二段测试代码及报错

lista_aziende_raw = []
for link in soup.find_all('a'):
    lista_aziende_raw.append(link.get('href')) 

print(lista_aziende_raw)

def parser(starting_list):
    parsing_name = 'Azienda'
    lista_aziende_filtered = []

    for x in starting_list:
        if parsing_name in x:
            lista_aziende_filtered.append(x)
    return lista_aziende_filtered

print(parser(lista_aziende_raw))

对应报错:

print(parser(lista_aziende_raw))
      ^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/enrico/Documents/Learning_Python/edo/web_scraper.py", line 27, in parser
    if parsing_name in x:
       ^^^^^^^^^^^^^^^^^
TypeError: argument of type 'NoneType' is not iterable

错误原因

  1. 列表推导式逻辑错误:
    代码中x in parsing_name是判断x是否等于列表['Azienda']中的元素(即判断x是否是'Azienda'字符串),但实际需求是筛选包含'Azienda'子串的链接,逻辑完全不符;同时列表中存在None值,导致in操作报错。

  2. 自定义函数的None值问题:
    网页中部分<a>标签没有href属性,link.get('href')会返回None,当执行parsing_name in x时,x为None,无法进行迭代操作,因此抛出TypeError。

解决方法

  1. 先过滤掉lista_aziende_raw中的None值,避免对非字符串类型进行操作;
  2. 修正匹配逻辑,从等值判断改为子串包含判断。

修正后的代码

列表推导式版本

lista_aziende_raw = []
for link in soup.find_all('a'):
    lista_aziende_raw.append(link.get('href'))

# 先过滤None,再筛选包含'Azienda'的链接
lista_aziende_filtered = [x for x in lista_aziende_raw if x is not None and 'Azienda' in x]

print(lista_aziende_filtered)

自定义函数版本

lista_aziende_raw = []
for link in soup.find_all('a'):
    lista_aziende_raw.append(link.get('href'))

def parser(starting_list):
    parsing_name = 'Azienda'
    lista_aziende_filtered = []

    for x in starting_list:
        # 先判断x不是None,再检查是否包含目标子串
        if x is not None and parsing_name in x:
            lista_aziende_filtered.append(x)
    return lista_aziende_filtered

print(parser(lista_aziende_raw))

额外优化:抓取时直接过滤None

可以在抓取阶段就跳过无href的标签,减少后续处理的负担:

lista_aziende_raw = []
for link in soup.find_all('a'):
    href = link.get('href')
    if href is not None:
        lista_aziende_raw.append(href)

# 后续过滤只需检查子串
lista_aziende_filtered = [x for x in lista_aziende_raw if 'Azienda' in x]

内容的提问来源于stack exchange,提问作者enrico223

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:00:16