2017-01-18 7 views
2

ウェブサイトからxmlを解析する過程で、私はUTF-8エンコーディングの問題を抱えてしまいました。具体的には、私がどのように見える文字列を持っている:私はこれを印刷するときPython UTF-8エンコーディングの問題

u'PA_g\xc3\xa9p7' 

は私が取得:

>> PA_gép7 

私が代わりにしたいことはここでは、次の

print('PA_g\xc3\xa9p7') 
>> PA_gép7 

から来ていることは私のコードです:

def get_api_xml_response(base_url, query_str): 
"""gets xml from api @ base_url using query_str""" 
    res = requests.get(u'{}{}'.format(base_url, query_str)) 
    xmlstring = clean_up_xml(res.content).encode(u'utf-8') 
    return ET.XML(xmlstring) 

私のfuネームスペースと他の問題を引き起こしていた文字を削除するには、clean_up_xmlが存在します。

def clean_up_xml(xml_string): 
"""remove the namespace and invalid chars from an xml-string""" 
    return re.sub(' xmlns="[^"]+"', '', xml_string, count=1).replace('&', '&') 

答えて

2

あなたはres.contentからで/おそらく/ UTF-8でエンコードされたバイナリ文字列を取り、再びUTF-8にそれをコードします。バイナリ文字列はdecode() 'dでなければなりません。Unicode文字列はencode()'とする必要があります。ただし、一部の文字はspecial casesです。 、それだけのElementTreeにバイナリ入力を渡す方が良いだろう、それは正しく処理するバイナリ文字列とclean_up_xml()作品以来

xmlstring = clean_up_xml(res.content) 
# let ElementTree decode content using information from the XML itself 
# e.g. <?xml version="1.0" encoding="UTF-8"?> 
return ET.XML(xmlstring) 

あなたはユニコードで動作するようにコードをリファクタリングすることを決定した場合、すべてのバイナリ入力する必要がありできるだけ早くデコードする:

# let requests decode response using information from HTTP header 
# e.g. Content-Type: text/xml; charset=utf-16 
xmlstring = clean_up_xml(res.text) 
return ET.XML(xmlstring) 

Unicodeに関連する質問をするとき、未来から輸入しprint_functionで、この場合には、Pythonの2をPythonのバージョンを指定することが重要です。 Python 3では次のように表示されます:

>>> print('PA_g\xc3\xa9p7') 
PA_gép7 
>>> 'PA_g\xc3\xa9p7' == u'PA_g\xc3\xa9p7' 
True 
+1

お返事ありがとうございます!あなたは正しかった、私はどこにあってはならないべきかをエンコードしていた! – Valkry