Python爬虫CSV列对齐问题:行值数量不同时如何对齐列?
解决数据爬取后列错位问题
问题背景
爬取欧盟法规倡议页面数据时,生成的CSV文件出现列错位:部分条目包含2个状态值,部分仅1个,导致后续列(如日期)无法对齐,无法按日期排序。尝试合并状态列未成功,怀疑与Excel手动拆分列操作有关。原代码如下:
#call packages import random import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By import pandas as pd # define driver etc. service_obj = Service("C:\\Users\\joerg\\PycharmProjects\\dynamic2\\chromedriver.exe") browser = webdriver.Chrome(service=service_obj) # create loop initiative_list = [] for i in range(0, 2): url = 'https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives_de?page='+str(i) browser.get(url) time.sleep(random.randint(5, 10)) initiative_item = browser.find_elements(By.CSS_SELECTOR, "initivative-item") initiatives = [item.text for item in initiative_item] initiative_list.extend(initiatives) df = pd.DataFrame(initiative_list) #create csv print(df) df.to_csv('Initiativen.csv') df.columns = ['tosplit'] new_df = df['tosplit'].str.split('\n', expand=True) print(new_df) new_df.to_csv('Initiativennew.csv')
核心问题
原代码直接提取整个条目文本后按换行符拆分,不同条目因状态数量不同导致换行数量不一致,最终列索引错位。从爬取阶段就结构化提取字段,才是根本解决办法,而非事后拆分文本。
修改后的代码
import random import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By import pandas as pd # 初始化驱动 service_obj = Service("C:\\Users\\joerg\\PycharmProjects\\dynamic2\\chromedriver.exe") browser = webdriver.Chrome(service=service_obj) initiative_list = [] for i in range(0, 2): url = f'https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives_de?page={i}' browser.get(url) time.sleep(random.randint(5, 10)) initiative_items = browser.find_elements(By.CSS_SELECTOR, "initivative-item") for item in initiative_items: # 结构化提取每个字段 title = item.find_element(By.CSS_SELECTOR, "h3 a").text # 提取所有状态标签,多个则用逗号拼接 status_tags = item.find_elements(By.CSS_SELECTOR, ".initiative-status-tag") status = ", ".join([tag.text.strip() for tag in status_tags]) # 提取日期 date = item.find_element(By.CSS_SELECTOR, ".initiative-date").text.strip() # 提取简短描述 description = item.find_element(By.CSS_SELECTOR, ".initiative-short-description").text.strip() # 将字段存入字典,保证结构一致 initiative_list.append({ "标题": title, "状态": status, "日期": date, "描述": description }) # 生成DataFrame并保存为CSV df = pd.DataFrame(initiative_list) print(df) df.to_csv('Initiativen_clean.csv', index=False, encoding='utf-8-sig') browser.quit()
代码说明
- 结构化提取字段:不再直接取整个条目的文本,而是通过CSS选择器定位每个字段的元素(标题、状态标签、日期、描述),确保每个条目都有固定的字段结构。
- 处理多状态值:用
find_elements提取所有状态标签,将多个状态用逗号拼接成一个字符串,统一存入"状态"列,避免因状态数量不同导致列错位。 - 优化CSV输出:添加
index=False避免生成索引列,encoding='utf-8-sig'保证Excel能正确识别特殊字符。 - 资源释放:添加
browser.quit()关闭浏览器,释放系统资源。
额外建议
- 放弃Excel手动拆分列的操作,爬取阶段结构化处理数据能彻底避免列错位问题。
- 可添加
try-except异常处理,防止单个条目字段定位失败导致整个程序中断。
内容的提问来源于stack exchange,提问作者JRGN1
相关产品推荐
相关产品推荐

