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

遍历CSV链接并写入新CSV时遇列拆分异常问题求助

解决CSV写入时逗号未分隔列且字符单独列的问题

你的问题根源在于对csv.writer.writerow()方法的使用理解有误,还有手动拼接字符串的方式不符合CSV写入规范,我来帮你拆解并修复:

问题分析

  1. writerow需要的是可迭代的字段列表,不是字符串:你现在把拼接好的newstring传给writerow(),而字符串本身是可迭代对象(每个字符都是一个独立元素),所以CSV writer会把每个字符当成单独的列,这就导致了"每个字符被放入单独列"的问题。
  2. 手动拼接逗号没必要,还容易出问题:csv.writer会自动帮你处理字段的分隔(默认是逗号),手动添加逗号不仅多余,还可能在字段本身包含逗号时引发格式错误。

修复方案

我们需要把每个要保存的字段收集到一个列表里,再传给writerow(),同时优化文件操作的安全性(用with语句自动管理文件):

import csv
import requests
from bs4 import BeautifulSoup

# 读取链接文件
with open("hrefs.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    # 用with语句自动管理输出文件,避免资源泄漏
    with open("output.csv", "w", newline="", encoding="utf-8") as listFile:
        writer = csv.writer(listFile)
        # 可选:写入表头,让CSV结构更清晰
        writer.writerow(["标题", "价格", "属性1", "属性2", "属性3"])
        
        for row in reader:
            newUrl = row[0]
            try:
                response = requests.get(newUrl)
                response.raise_for_status()  # 捕获请求失败的情况
                newData = response.text
                newSoup = BeautifulSoup(newData, 'lxml')
                
                # 收集字段到列表,替代手动拼接字符串
                row_data = []
                
                # 处理标题,加存在性判断避免索引报错
                titles = newSoup.findAll('span', {'id': 'titletextonly'})
                row_data.append(titles[0].text.strip() if titles else "无标题")
                
                # 处理价格
                prices = newSoup.findAll('span', {'class': 'price'})
                row_data.append(prices[0].text.strip() if prices else "无价格")
                
                # 处理属性
                for ana in newSoup.findAll('p', {'class':'attrgroup'}):
                    for myb in ana.findAll('b'):
                        row_data.append(myb.text.strip())
                
                # 写入一行完整数据
                writer.writerow(row_data)
                print(",".join(row_data))  # 打印和CSV一致的内容
            except Exception as e:
                print(f"处理链接 {newUrl} 时出错: {str(e)}")

关键修改点

  • 用row_data列表收集每个字段,替代手动拼接带逗号的字符串,让CSV writer自动处理分隔
  • 使用嵌套with语句同时管理输入和输出文件,自动处理文件关闭,避免资源泄漏
  • 添加异常处理,避免单个链接出错导致整个程序中断
  • 对每个字段做存在性判断,防止titles[0]这类索引操作引发IndexError
  • 指定文件编码为utf-8,避免中文乱码问题
  • 添加newline=""参数,避免Windows系统下CSV出现多余空行

这样修改后,CSV文件会正确将每个字段分隔到不同列,再也不会出现每个字符单独列的问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:48:28