使用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
相关产品推荐
相关产品推荐

