Python(BeautifulSoup)如何避免字符串被解析为科学计数法?
问题:XML解析提取字符串时被误识别为科学计数法
使用BeautifulSoup解析XML,从标签文本中提取第一个空格前的子串(如1E001、0E001这类5字符编码)时,最终得到的结果是数值(比如1E001变成10),而非原始字符串。即使尝试用str()或f-string转换也无法解决,示例标签文本:
'1E001 “Technology” according to the General Technology Note for the “development” or “production” of items controlled'
原因分析
问题并非出在字符串提取阶段,而是写入CSV文件时被自动转换。csv.writer默认会将符合数值格式(包括科学计数法格式)的字符串自动解析为数值类型,导致1E001被转换成10。
解决方案
方案1:CSV写入时强制非数值内容加引号
修改CSV写入代码,添加quoting=csv.QUOTE_NONNUMERIC参数,让所有非数值内容被引号包裹,避免自动转换:
with open(f"ccl_{today}.csv", "w", encoding="utf-8", newline="") as csvfile: csvwriter = csv.writer(csvfile, delimiter="|", quoting=csv.QUOTE_NONNUMERIC) csvwriter.writerow(fields) csvwriter.writerows(rows)
方案2:给字符串添加零宽空格标记
在提取的ECCN字符串前添加零宽空格(不可见字符),让CSV识别为纯文本:
def find_eccn(text:str) -> str: result = text[:text.find(" ")] return f"\u200B{result}"
注:零宽空格不会影响视觉显示,但后续处理数据时可能需要去除该字符
方案3:返回带引号的字符串
直接给提取的字符串添加引号,写入CSV后保留原始格式:
def find_eccn(text:str) -> str: result = text[:text.find(" ")] return f'"{result}"'
注:此方案会让CSV中的ECCN字段带引号,适合直接查看无需后续处理的场景
内容的提问来源于stack exchange,提问作者txmountaineer
相关产品推荐
相关产品推荐

