Python请求和Unicode

Jav*_*aaa 26 python unicode python-requests

我正在使用请求库来查询Diffbot API以从网页URL获取文章的内容.当我访问我在浏览器中创建的请求URL时,它返回一个带有Unicode文本的JSON对象(对吗?)(例如我稍微缩短了文本):

{"icon":"http://mexico.cnn.com/images/ico_mobile.jpg","text":"CIUDADDEMÉXICO(CNNMéxico)\ u2014 Kassandra Guazo Cano tiene32años,pero estedomingopastópriprimera vez enunaelección.\n \"没有habíasacadomi(credencial del)IFE(Instituto Federal Electoral)porque al hacereltrámitehairmucha mofa cuando ven que tu nombre no conide con tu y otros documentos de acuerdo con su nueva identidad. nSánchez骰子阙洛杉矶solicitantes没有儿子discriminados,佩罗拉experiencia德Kassanda ES diferente:\"干草阙丹戎巴葛未licenciado,DOS peritos(恩特雷里奥斯埃勒斯未endocrinólogo)Además,EL juez格言sentencia第下午坎比奥德农布雷Ÿ州市没有上课有利tienes阙esperar OTROS夸A号段御宇一个demandar人registro民事\ "\南特ESTAsituación,报理事会全国第PrevenirŸEliminar LA sculina,洛杉矶transgéneroVOTAN - 墨西哥:博托2012 - 全国", "URL":"HTTP:/ /mexico.cnn.com/nacional/2012/07/02/con-apariencia-de-mujer-e-identidad-masculina-los-transexuales-votan ", "的xpath": "/ HTML [1]/BODY [1]/SECTION [5]/DIV [1]/ARTICLE [1]/DIV [1]/DIV [6]"}

当我使用python请求库时,如下所示:

def get_article(self, params={}):
  api_endpoint = 'http://www.diffbot.com/api/article'
  params.update({
    'token': self.dev_token,
    'format': self.output_format,
  })
  req = requests.get(api_endpoint, params=params)
  return json.loads(req.content)
Run Code Online (Sandbox Code Playgroud)

它返回此(再次注意我在某种程度上缩短了文本):

{u'url':u'http://mexico.cnn.com/nacional/2012/07/02/con-apariencia-de-mujer-e-identidad-masculina-los-transexuales-votan',u'text ":u'CIUDAD德米\ xc9XICO(CNNM\xe9xico)\ u2014卡桑德拉Guazo卡诺tiene 32个\ xf1os,佩罗埃斯特多明戈particip\XF3 POR西甲VEZ烯乌纳elecci\xf3n\N"无HAB \赛达sacado英里( credencial德尔)IFE(研究所联邦选举)porque人hacOyuky沃尔玛\ xednez山口\ xedn,坦比\ xe9n transg\xe9nero,Y阙estaba acompa\xf1ada德SUS DOS HIJOSŸ苏MAM\XE1.\nAmbas trabajan科莫activistas恩埃尔森特罗德Apoyo一个拉斯维加斯Identidades跨,交流,东德participan EN UNA坎帕\ xf1a德prevenci\xf3n德enfermedades有性.\n "个QUISI\xe9ramos阙没有独奏号vean科莫trabajadoras有性Øestilistas,中美阙luchamos POR nuestros derechos",骰子卡珊德拉mientras sonr\xede,sostiene苏credencial德选民Ÿlevanta苏pulgar entintado 'u'title':u'Con apariencia日指数Mujerēidentidad masculina,洛杉矶transg\xe9nero VOTAN - 中号\ xe9xico:博托2012 - 全国", u'xpath':你'/HTML [1]/BODY [1]/SECTION [5]/DIV [1]/ARTICLE [1]/DIV [1]/DIV [6]',u'icon':u'http:// mexico. cnn.com/images/ico_mobile.jpg'}

我不太懂Unicode.如何确保我得到的请求仍然是Unicode?

TTT*_*TTT 40

您可以使用req.text而不是req.content确保您获得Unicode.方法描述于:

http://docs.python-requests.org/en/latest/api/#main-interface

  • 有没有办法不通过请求获得unicode JSON响应?似乎在没有unicode的情况下打印出终端的JSON响应的唯一方法是将JSON打印为字符串,但当然它不再是数据结构,只是一个字符串.有没有办法处理请求响应作为"纯"JSON仍然作为数据结构,但没有Unicode? (5认同)
  • 注意:在某些情况下,有必要执行`response.content.decode('utf-8')`将原始字节转换为UTF-8. (3认同)

Sim*_*mon 14

关于"我不太了解unicode",Joel Spolsky和官方Python Unicode HowTo有一个关于Unicode 的有趣入门,这是一个10分钟的阅读,涵盖了Python特有的一切.

请求的文档说,请求将总是返回unicode的,您发布的示例内容,其实是unicode的(注意u''字符串语法?这是Python对Unicode字符串的语法.),所以没有问题.请注意,如果您在Web浏览器中查看JSON响应,u''则不会存在,因为它是Python存储字符串的属性.

如果unicode对您的应用程序很重要,请不要在不了解unicode的情况下尝试应对.如果你不知道自己在做什么,那么你正处于一个充满痛苦的世界,如果调试那么字符集问题会非常令人沮丧.阅读上面提到的两篇文章可能需要半个小时.