python - 从 API 获取的字符串中的奇怪字符无法解码
问题描述
我正在创建一个从 API 获取数据并将其存储在我自己的数据库中的程序。问题是一些刺在引号应该有的地方有某种字符代码。经过进一步检查,它似乎是引号的十六进制代码,但它的双重转义非常惊人,让我和我所有的解码器都感到困惑。我相信字符串以 ascii 形式出现,我对其他字符没有任何其他问题。
我知道我可以简单地用实际字符替换特定的字符代码,但我需要在将来捕获这样的东西。如果是十六进制,我需要梳理十六进制代码的字符串并按程序替换它们。
我试过了
clean_val = unicodedata.normalize('NFKD', val).encode('latin1').decode('utf8')
我对整件事感到很困惑
response = session.get(url)
if response.status_code == requests.codes.ok:
print(response.content)
b'{"Description":"American Assets Trust, Inc. (the \\\u0093company\\\u0094) is a full service, vertically ..."}'
我认为字符串存储在他们的数据库中,如 \" 以满足某些 SQL 转义协议。当我得到它时,转义斜杠与字符代码混合在一起,从而弄乱了编码。
解决方案
看起来这些字符来自编码为 cp1252 的文本。可以解码它们
>>> bs = b'{"Description":"American Assets Trust, Inc. (the \\u0093company\\u0094) is a full service, vertically ..."}'
>>> d = json.loads(bs)
>>> s = d['Description']
>>> decoded = s.encode('latin-1').decode('cp1252')
>>> decoded
'American Assets Trust, Inc. (the “company”) is a full service, vertically ...'
但您必须手动替换它们,使用str.replace
或str.translate
>>> table = str.maketrans('“”', '""')
>>> decoded = s.encode('latin-1').decode('cp1252')
>>> decoded.translate(table)
'American Assets Trust, Inc. (the "company") is a full service, vertically ...'
推荐阅读
- cplex - 关于 CPLEX 错误 32201 许可证无效的问题
- vue.js - 如何在自定义日期选择器下拉菜单中使用 30 天计算闰年和月份?
- python - 在使用 If 语句和列表时需要帮助
- java - 找到第一个超过 500 个除数的三角形数
- javascript - 为什么即使我没有更改任何内容,当按下回车键时,更改事件也会在 v-text-field 中激活?
- python - 编译 PyQt5 脚本时出现 Nuitka 错误“隐式模块 sip”错误
- python - 获取遵循域的路径
- ruby-on-rails - 设计 edit.html.erb 视图中的语法错误
- php - 是否可以将 PHP 配置为使用虚拟主机
- css - IntelliJ生成的标头中CSS文件的路径不正确