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

使用BeautifulSoup导出非英文内容至CSV文件的问题及后续异常

解决匈牙利食谱爬取中的编码与CSV格式化问题

嘿,我来帮你搞定这两个爬取食谱时遇到的问题,都是Python处理字符串和CSV时的常见坑,咱们一步步拆解解决~

一、Python 2.7 里的 UnicodeEncodeError 问题

先说说你在Python2.7碰到的编码报错——这可是Python2时代的经典老坑!因为Python2默认的字符串编码是ASCII,而匈牙利语里的特殊字符(比如ő、ű这类)完全超出了ASCII的覆盖范围,写入CSV时自然就触发编码错误了。

解决起来其实很直接,记住两个关键点:

  • 写入文件时一定要指定utf-8编码,Python2的原生open不支持直接传encoding参数,所以用codecs模块来打开文件更稳妥
  • 从BeautifulSoup提取内容后,尽量保留Unicode字符串类型,别乱转成str(),BeautifulSoup在Python2里默认返回的就是Unicode,只要不瞎折腾就没问题

给你个简单的示例代码参考:

import codecs
import csv

# 假设你已经爬取到了食谱数据,比如是包含字典的列表
recipes = [
    {"title": "Lecsó", "ingredients": ["paprika", "uborka", "hagyma"]}
]

# 用codecs.open指定utf-8编码写入
with codecs.open("hungarian_recipes.csv", "w", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["Recipe Title", "Ingredients"])
    for recipe in recipes:
        # 直接把Unicode字符串传入writer,不用额外转换
        writer.writerow([recipe["title"], ", ".join(recipe["ingredients"])])

二、Python 3 中内容被逗号拆分的问题

切换到Python3后编码问题解决了,但又出现简介和食材每个字符被逗号分开的情况——这大概率是你把单个字符串当成可迭代对象传给了CSV writer。CSV writer会把字符串的每个字符当成单独的列来处理,自然就拆得乱七八糟了。

比如你可能不小心写了这样的错误代码:

# 错误示例:直接传字符串,writer会迭代每个字符
writer.writerow([recipe["title"], recipe["description"]])
# 如果description是"Classic Hungarian stew",writer会把每个字符拆成一列

解决办法也很明确:

  • 如果你的简介/食材是列表类型,先把列表拼接成单个字符串(比如用, 分隔)再传入
  • 如果已经是字符串,确保你是把它作为一个完整元素放进列表里传给writer,别直接传字符串本身

正确的写法参考:

import csv

recipes = [
    {"title": "Lecsó", "description": "Classic Hungarian vegetable stew", "ingredients": ["paprika", "uborka", "hagyma"]}
]

# Python3里open可以直接指定encoding,记得加newline=""避免空行
with open("hungarian_recipes.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["Title", "Description", "Ingredients"])
    for recipe in recipes:
        # 把食材列表转成逗号分隔的字符串
        ingredients_str = ", ".join(recipe["ingredients"])
        # 每个字段都是单个元素,打包进列表再传入
        writer.writerow([recipe["title"], recipe["description"], ingredients_str])

另外,如果你的简介或食材本身带逗号(比如"paprika, sweet"),可以给writer加个quoting参数,让CSV把带逗号的字段用引号包裹,避免被错误拆分:

writer = csv.writer(f, quoting=csv.QUOTE_ALL)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:03:49