BeautifulSoup4解析Tableau XML写入文件时&符号重复转义问题求助
问题根因
你遇到的是XML特殊字符二次编码问题:
- BeautifulSoup的XML解析器在写入属性值时,会自动对属性内的
&、<、>、单引号、双引号等XML特殊字符做标准转义 - 你在生成
formula_final时提前手动做了XML转义,把单引号转成了&apos;,BS处理时会把字符串里的&再次转义为&,最终就变成了不符合Tableau预期的&amp;apos;
解决方案
第一步:修改公式生成逻辑
不要手动做XML转义,直接输出带原始单引号的普通字符串即可,转义工作交给BS自动处理:
# 拼接公式片段时用Python原生的转义单引号,不要写XML转义符 formula_segment = 'When \'[{}]\' then {} '.format(rows['Column_Name'], rows['Formatted_ColumnName']) # 其他拼接逻辑保持不变,最终得到的formula_final为不带XML转义的原始公式内容
第二步:修改文件写入逻辑
不要使用str(bs_content)输出,改用BS提供的prettify()方法保证XML格式规范,同时指定UTF-8编码避免乱码:
for calculation in bs_content.find_all('column', {'caption': 'Group By', 'datatype':'string', 'name':'[Calculation_12345678910]'}): calculation.find('calculation')['formula'] = formula_final with open('test.twb', 'w', encoding='utf-8') as file: file.write(bs_content.prettify())
特殊情况兼容
如果Tableau对转义格式有特殊要求,BS默认转义结果仍不符合预期,可以在输出后加一次全局替换修正:
with open('test.twb', 'r', encoding='utf-8') as f: content = f.read() # 替换多余的二次转义内容 content = content.replace('&apos;', ''') with open('test.twb', 'w', encoding='utf-8') as f: f.write(content)
内容的提问来源于stack exchange,提问作者Patrick Landis
相关产品推荐
相关产品推荐

