2017-09-06 32 views
1

所以我使用了BeautifulSoup。這讓我有些HTML節點的文本,但這些節點具有一定的Unicode字符轉換爲:逃脫序列串中將Python轉義的Unicode序列轉換爲UTF-8

例如,有這樣的一個HTML元素: 50 €由BeautifulSoup檢索,如: soup.find("h2").text作爲此字符串:50\u20ac,它只能在Python控制檯中讀取。 但是,當寫入JSON文件時,它變得不可讀。 注意:我將以下代碼保存到json: with open('file.json', 'w') as fp: json.dump(fileToSave, fp) 如何將這些Unicode字符轉換回UTF-8或其他什麼使它們再次可讀?

+0

你嘗試: F =開放( 'somefile', 'WB'),然後 f.write( '你的文字') –

+0

**你保存爲JSON **是什麼意思?你是否將JSON返回給其他函數,或者你是否將它寫入文件? – chad

+0

@chad寫入JSON文件。 –

回答

2

使用Python 3,如果你不使用ensure_ascii=False轉儲到JSON小演示,非ASCII將被寫入到JSON使用Unicode轉義碼。這不會影響加載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€" 
+0

非常感謝!這工作,現在它是可讀的。但是,如何正確加載它?現在,我使用此代碼加載文件: json1_file =開放(文件名+ '以.json') json1_str = json1_file.read() 文件= json.loads(json1_str) 但不顯示的字符正確。我無法在評論中正確嵌入代碼,對此抱歉。 –

+0

JSON現在可以正確呈現,但是當加載回Python時,它看起來如此:'50â¬'。 –

+0

@MohamedOun使用'encoding ='utf8''打開文件。這不是默認設置。 –

0

請嘗試以下:

utf8string = <unicodestring>.encode("utf-8") 
+0

問題是,它返回一個字符串,而不是一個unicode字符串。無論如何,我嘗試編碼該字符串,但我無法將其保存到JSON,因爲'類型'字節的對象'不是JSON序列化的'。 –

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) 
+0

我正在使用Python3,它在那裏不起作用? –

+0

@MohamedOun它在Python3中工作正常,但你沒有顯示你做錯了什麼的例子,所以我們可以糾正它。 –

+0

@MarkTolonen我有一個字典,其中的值是具有unicode字符的字符串。我將該字典保存爲JSON文件,但unicode字符顯示爲'\ u20ac'。你需要更多的細節嗎? –