Python循环生成列表遇空值时,如何填充指定文本?
我现有如下基于Selenium的Python代码:
for car in car_list: specs = car.find_elements(By.XPATH, ".//li[@class='sc-kcuKUB bMKvpn']") car_specs = [] for spec in specs: entry = spec.get_attribute('innerHTML') entry = spec.text car_specs.append(entry) all_specs.append(car_specs)
该代码可生成正常的车辆规格列表,输出示例:
print(all_specs)
['2021 (21 reg)', 'SUV', '35,008 miles', '395BHP', 'Automatic', 'Electric', '1 owner'] [['2021 (21 reg)', 'SUV', '35,008 miles', '395BHP', 'Automatic', 'Electric', '1 owner']]
但部分车辆规格为空时会生成空列表,输出示例:
['2021 (21 reg)', 'SUV', '35,008 miles', '395BHP', 'Automatic', 'Electric', '1 owner'] [['2021 (21 reg)', 'SUV', '35,008 miles', '395BHP', 'Automatic', 'Electric', '1 owner'] []]
(注:末尾存在空列表)
这导致在拼接DataFrame时出现行转置问题,因为该DataFrame包含空列表,而另一个没有。我曾尝试如下代码但未解决:
for spec in specs: if spec is None: car_specs.append('texthere') else: entry = spec.get_attribute('innerHTML') entry = spec.text car_specs.append(entry)
请问如何在spec或specs为空时,填充指定文本以确保列表不为空?
解决方案
你的问题核心是没判断specs本身是否为空——find_elements返回的是空列表而非None,所以之前判断spec is None完全无效,循环根本不会执行,直接就把空的car_specs加入了结果。
基础解决方法(空列表时填充单个占位文本)
修改思路:先判断specs是否为空,为空则直接添加填充文本;不为空则正常遍历提取内容。同时可以删掉冗余的get_attribute('innerHTML')(因为后面被spec.text覆盖了)。
修改后的代码:
for car in car_list: specs = car.find_elements(By.XPATH, ".//li[@class='sc-kcuKUB bMKvpn']") car_specs = [] if not specs: # 判断specs是否为空列表 car_specs.append('无车辆规格信息') # 替换成你需要的填充文本 else: for spec in specs: car_specs.append(spec.text) all_specs.append(car_specs)
进阶解决方法(保证列表长度一致)
如果需要每个车辆的规格列表长度和正常数据一致(避免DataFrame拼接时的维度问题),可以先明确正常规格的字段数量,空列表时补充对应数量的填充文本:
EXPECTED_SPEC_COUNT = 7 # 根据正常数据的字段数设置,比如示例里是7个 FILL_TEXT = '无信息' for car in car_list: specs = car.find_elements(By.XPATH, ".//li[@class='sc-kcuKUB bMKvpn']") car_specs = [spec.text for spec in specs] # 补充缺失的字段,保证列表长度统一 if len(car_specs) < EXPECTED_SPEC_COUNT: car_specs += [FILL_TEXT] * (EXPECTED_SPEC_COUNT - len(car_specs)) all_specs.append(car_specs)
内容的提问来源于stack exchange,提问作者Curious Student

