将Python转义的Unicode序列转换为UTF-8

3
我正在使用Beautiful Soup。它可以获取一些HTML节点的文本,但这些节点包含一些Unicode字符,这些字符在字符串中被转换为转义序列。
例如,一个具有以下内容的HTML元素: 50 € 通过Beautiful Soup获取到的是这样的字符串: soup.find("h2").text50\u20ac,只能在Python控制台中阅读。 但是当写入JSON文件时,该字符串变得不可读。 注意:我使用以下代码保存到JSON文件:
with open('file.json', 'w') as fp:
        json.dump(fileToSave, fp)

如何将那些Unicode字符转换回UTF-8或其他可读的格式?

你尝试过以下代码吗: f = open('somefile', 'wb') 然后执行 f.write('your text') - Masoud Masoumi Moghadam
“saved to JSON” 是什么意思?你是将 JSON 返回给其他函数,还是将其写入文件中? - chad
@chad 写入 JSON 文件。 - Mohamed Oun
提供一个 [mcve]。你如何将它保存为 JSON?展示字符串内容的 repr() - Mark Tolonen
3个回答

4

使用Python 3的小演示。如果您不使用ensure_ascii=False将内容转储为JSON,那么非ASCII字符将以Unicode转义代码的形式写入JSON。这不会影响加载JSON的能力,但在.json文件中可读性较差。

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from bs4 import BeautifulSoup
>>> html = '<element>50\u20ac</element'
>>> html
'<element>50€</element'
>>> soup = BeautifulSoup(html,'html')
>>> soup.find('element').text
'50€'
>>> import json
>>> with open('out.json','w',encoding='utf8') as f:
...  json.dump(soup.find('element').text,f,ensure_ascii=False)
...
>>> ^Z

out.json的内容(使用UTF-8编码):

"50€"

非常感谢!这个方法可行,现在可以读取了。但是我该如何正确地重新加载它呢?目前我使用以下代码加载文件:json1_file = open(filename + '.json') json1_str = json1_file.read() file = json.loads(json1_str)但是字符显示不正确。很抱歉我不能在评论中正确嵌入代码。 - Mohamed Oun
JSON现在正确渲染,但是当重新加载到Python时,它看起来像这样:50€ - Mohamed Oun
1
@MohamedOun 使用 encoding='utf8' 打开文件。这不是默认设置。 - Mark Tolonen

2

对于Python 2.7,我认为您可以使用codecsjson.dump(obj, fp, ensure_ascii=False)。示例:

import codecs
import json

with codecs.open(filename, 'w', encoding='utf-8') as fp:
    # obj is a 'unicode' which contains "50 €"
    json.dump(obj, fp, ensure_ascii=False)

@MohamedOun 在Python3中它运行良好,但您没有展示出您做错了什么,以便我们进行更正。 - Mark Tolonen
@MarkTolonen 我有一个字典,其中的值是包含Unicode字符的字符串。我将该字典保存为JSON文件,但其中的Unicode字符显示为\u20ac。您需要更多细节吗? - Mohamed Oun

0
请尝试以下内容:
utf8string = <unicodestring>.encode("utf-8")

1
问题是它返回的是一个字符串,而不是Unicode字符串。无论如何,我尝试对该字符串进行编码,但我无法将其保存到JSON中,因为“类型为'bytes'的对象不可序列化为JSON”。 - Mohamed Oun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接