Pandas比较不同CSV两列遇TypeError及nan、列名异常问题
解决爬虫断点续爬的TypeError与异常值问题
看起来你遇到的问题主要来自两个方面:CSV读取时的表头混入数据、列中缺失值(nan)导致的类型不匹配,我来一步步帮你拆解和修复:
问题根源分析
为什么出现
[nan, 'lien']?'lien'这个值大概率是读取CSV时误把表头当成了数据行。比如当你初始化空DataFrame后,可能错误地将待爬CSV的表头作为数据行读入,或者pd.read_csv的参数设置错误(比如误用了header=None),导致第一行表头被当作普通数据。nan则是因为你的'lien'列存在缺失值,pandas会把空值标记为nan(float类型),当你把列转成列表时,这些nan会被保留下来。
TypeError报错的原因
后续代码中你可能尝试把这些nan(float类型)和字符串进行拼接操作,Python不允许不同类型直接拼接,所以抛出了can only concatenate str (not "float") to str的错误。
修复方案与优化代码
我会针对你的需求重新编写逻辑,解决上述问题:
1. 核心优化点
- 严格区分CSV的表头和数据行,避免表头混入数据
- 提前过滤
nan值,确保所有链接都是字符串类型 - 调整断点续爬的逻辑:从待爬列表中排除已爬取的链接(比对称差集更符合断点续爬的实际需求)
2. 完整修复代码
import pandas as pd import os def get_unscraped_links(scraped_csv, to_scrape_csv): # 初始化已爬取链接集合 scraped_links = set() # 检查已爬取CSV是否存在 if os.path.exists(scraped_csv): scraped_df = pd.read_csv(scraped_csv) # 提取'lien'列,过滤空值并转为字符串,再转成集合(方便快速查找) scraped_links = set(scraped_df['lien'].dropna().astype(str)) # 读取待爬取的CSV to_scrape_df = pd.read_csv(to_scrape_csv) # 提取有效链接:过滤空值、转为字符串、排除误读的表头值 raw_links = to_scrape_df['lien'].dropna().astype(str).tolist() valid_to_scrape = [link for link in raw_links if link != 'lien'] # 筛选出未爬取的链接 unscraped_links = [link for link in valid_to_scrape if link not in scraped_links] return unscraped_links # 调用示例(替换成你的实际文件路径) listeLiens = get_unscraped_links('dataset/infos.csv', 'your_to_scrape_file.csv') print(listeLiens)
额外说明
- 如果你的对称差集逻辑是故意设计的(比如需要找出两个列表中独有的链接),可以把最后一步改成:
# 对称差集逻辑(保留两个列表各自独有的元素) unscraped_links = list(set(valid_to_scrape).symmetric_difference(scraped_links)) - 后续爬取时,记得把新爬取的链接追加到
dataset/infos.csv时,不要重复写入表头,可以用mode='a', header=False参数:new_links_df.to_csv('dataset/infos.csv', mode='a', header=False, index=False)
内容的提问来源于stack exchange,提问作者rachidj
相关产品推荐
相关产品推荐

