【问题标题】:How to change the encoding of JSON dictionary string value?如何更改 JSON 字典字符串值的编码?
【发布时间】:2016-10-24 16:10:38
【问题描述】:

我遇到了一个问题,使用“utf-8”编码的字符串未按预期打印。该字符串包含重音字母(á、é、ü、ñ 等),并且是从 Wikipedia API 返回的 JSON dict 的一部分。

下面是一个带有字母é的例子:

== 完整代码:==

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 得到不同的结果?如何使redirect_title 打印为"José Eduardo Agualusa"

【问题讨论】:

  • 在我看来,uh.read() 中的 json 数据中包含 'Jos\\xe9 Eduardo Agualusa',而不是 'Jos\xe9 Eduardo Agualusa' — 如果将 redirect_title2 更改为前者,则结果匹配。也许这是一个 API 错误。

标签: python json encoding diacritics wikipedia-api


【解决方案1】:

您的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多