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
错误原因
列表推导式逻辑错误:
代码中x in parsing_name是判断x是否等于列表['Azienda']中的元素(即判断x是否是'Azienda'字符串),但实际需求是筛选包含'Azienda'子串的链接,逻辑完全不符;同时列表中存在None值,导致in操作报错。自定义函数的None值问题:
网页中部分<a>标签没有href属性,link.get('href')会返回None,当执行parsing_name in x时,x为None,无法进行迭代操作,因此抛出TypeError。
解决方法
- 先过滤掉
lista_aziende_raw中的None值,避免对非字符串类型进行操作; - 修正匹配逻辑,从等值判断改为子串包含判断。
修正后的代码
列表推导式版本
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
相关产品推荐
相关产品推荐

