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

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()

代码说明

  1. 结构化提取字段:不再直接取整个条目的文本,而是通过CSS选择器定位每个字段的元素(标题、状态标签、日期、描述),确保每个条目都有固定的字段结构。
  2. 处理多状态值:用find_elements提取所有状态标签,将多个状态用逗号拼接成一个字符串,统一存入"状态"列,避免因状态数量不同导致列错位。
  3. 优化CSV输出:添加index=False避免生成索引列,encoding='utf-8-sig'保证Excel能正确识别特殊字符。
  4. 资源释放:添加browser.quit()关闭浏览器,释放系统资源。

额外建议

  • 放弃Excel手动拆分列的操作,爬取阶段结构化处理数据能彻底避免列错位问题。
  • 可添加try-except异常处理,防止单个条目字段定位失败导致整个程序中断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:26:03