2016-06-22 9 views
1

"utf-8"でエンコードされた文字列が正常に印刷されないという問題が発生しました。この文字列にはアクセント付き文字(á、é、ü、ñなど)が含まれており、Wikipedia APIから返されたJSON dictの一部です。JSON辞書の文字列値のエンコーディングを変更するにはどうすればよいですか?

==完全なコード:以下

が文字Eと一例である==

import urllib 
import json 
import re 

def check(wikitext): 
    redirect_title = re.findall('\[\[[\S ]+\]\]', str(wikitext))[0] 
    redirect_title = redirect_title.strip('[]') 
    redirect_title = redirect_title.decode('ISO-8859-1').encode('utf8') 
    return redirect_title 

serviceurl = 'https://en.wikipedia.org/w/api.php?' 
action = 'parse' 
formatjs = 'json' 
prop = 'text|wikitext' 
title = 'Jose Eduardo Agualusa' 
url = serviceurl + urllib.urlencode({'action':action, 'page': title, 'format': formatjs, 'prop': prop}) 
uh = urllib.urlopen(url) 
data = uh.read() 
try: 
    js = json.loads(data) 
except: 
    js = None 
    print ' Page is not found' 

wikitext = js["parse"]["wikitext"] 
redirect_title = check(wikitext) 
print 'redirect_title:',redirect_title 

redirect_title2 = 'Jos\xe9 Eduardo Agualusa' 
redirect_title2 = redirect_title2.decode('ISO-8859-1').encode('utf8') 
print 'redirect_title2:', redirect_title2 

結果は:

redirect_title: Jos\xe9 Eduardo Agualusa 
redirect_title2: José Eduardo Agualusa 

redirect_titleから解析されWikipedia API JSONエンコードする前に、'Jos\xe9 Eduardo Agualusa'と表示されます。エンコードされた後は、変更されていないようです。

redirect_title2は、文字列'Jos\xe9 Eduardo Agualusa'で直接割り当てられ、次にエンコードされます。

redirect_titleredirect_title2の結果が異なるのはなぜですか? "José Eduardo Agualusa"としてredirect_titleを印刷するにはどうすればよいですか?

+0

は(uh.read 'からJSONデータのように私には見えるが)' ' 'ヨス\\ XE9エドゥアルドAgualusa''を持っています'' Jos \ xe9 Eduardo Agualusa ''ではなく、 'redirect_title2'を' 'redirect_title2''に変更すると結果が一致します。たぶんそれはAPIのバグです。 – martineau

答えて

0

check()ルーチンは、辞書の文字列表現を解析することを含め、非常に奇妙なことをします。

代わりにこれを試してみてください:

def check(wikitext): 
    for value in wikitext.values(): 
     result = re.findall(ur'\[\[.*?\]\]', value) 
     if result: 
      return result[0].strip(u'[]') 
    return u'' 

またはこの:

def check(wikitext): 
    redirect_title = u''.join(wikitext.values()) 
    redirect_title = re.findall(u'\[\[[\S ]+\]\]', redirect_title)[0] 
    redirect_title = redirect_title.strip(u'[]') 
    return redirect_title 
関連する問題