2016-06-22 26 views
1

Ich stieß auf ein Problem eine Zeichenfolge mit der Codierung "UTF-8" wird nicht wie erwartet gedruckt. Die Zeichenfolge enthält akzentuierte Buchstaben (á, é, ü, ñ usw.) und ist Teil eines JSON-Diktats, das von der Wikipedia-API zurückgegeben wird.Wie ändert man die Kodierung des JSON-Wörterbuch-String-Wertes?

Im Folgenden ein Beispiel mit dem Buchstaben E:

== Der vollständige Code: ==

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 

Das Ergebnis ist:

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

redirect_title aus der analysiert wird, Wikipedia-API-JSON. Vor der Codierung wird als 'Jos\xe9 Eduardo Agualusa' gedruckt. Nach der Verschlüsselung scheint sich das nicht zu ändern.

redirect_title2 wird direkt mit der Zeichenfolge 'Jos\xe9 Eduardo Agualusa' zugewiesen und dann codiert.

Warum bekomme ich unterschiedliche Ergebnisse für redirect_title und redirect_title2? Wie kann ich redirect_title drucken als "José Eduardo Agualusa"?

+0

mir sieht aus wie die JSON-Daten aus 'uh.read()' 'hat 'Jos \\ xe9 Eduardo Agualusa'' in ihr nicht "Jos \ xe9 Eduardo Agualusa" - wenn du "redirect_title2" auf "extro" änderst, stimmen die Ergebnisse überein. Vielleicht ist es ein API-Fehler. – martineau

Antwort

0

Ihre check() Routine führt einige sehr seltsame Dinge durch, einschließlich der Analyse der Zeichenfolgendarstellung eines Wörterbuchs.

Versuchen Sie stattdessen:

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

Oder diese:

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