【发布时间】: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_title 和redirect_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