在Python 2.7中的Unicode Cyrillic字符串

2024-04-26 00:39:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段python2.7代码,它返回一个用UTF-8编码的网页。 它基本上是这样做的:

  arequest=urllib2.urlopen(request.httprequest.host_url[:-1]+record.path)
  response=arequest.read()
  parser = etree.HTMLParser()
  tree   = etree.fromstring(response, parser)

然后我从树上提取标签信息:

^{pr2}$

问题是,生成的代码返回这个值,其中seo_a_title_text是用\xd0编码的,而不是我需要的\u0428

[{'seo_a_title_text': u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'src_value': '/logo.png', 'seo_text': u'Logo of \xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'template_tag': False, 'page_id': 150, 'tag_type': 'img'}]

西里尔字母的字符串是“Штаы”,我需要把\xd0等转换成 \u0428\u0442\u0430\u0442\u044b对于成功的数据库保存,否则当我再次读回它时,它看起来像“Ð。在

如何使字符串看起来像\u等,而不是\x等。?我一定是漏掉了什么东西,但我已经在网络上和控制台上挣扎了好几个小时,试图让它发挥作用。在

侧注,文件顶部有以下注释:

# -*- coding: utf-8 -*-

不确定这是否会影响答案?在


Tags: 代码textseoparser编码titleresponseetree
2条回答
var = [{'seo_a_title_text': u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'src_value': '/logo.png', 'seo_text': u'Logo of \xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b ', 'template_tag': False, 'page_id': 150, 'tag_type': 'img'}]
print var[0]['seo_a_title_text']

这个\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b字符串是Штаты的utf8表示。在

Utf8使用一个或多个字节对字符进行编码,因此例如:Ш(在unicode表中有0x0428的位置,在Utf8中将其编码为\xd0\xa8)。在

现在比较棘手的是,您将得到一个utf8字符串作为unicode字符串。在正确应用utf8之前,您需要将其转换为字节。 一个诀窍是使用iso8859-1(又名拉丁语-1),因为它将前256个Unicode码位映射到它们的字节值。在

>>> u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'
'ШÑ\x82аÑ\x82Ñ\x8b'
>>> u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'.encode('latin1')
b'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'
>>> u'\xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd1\x8b'.encode('latin1').decode('utf8')
'Штаты'

注意:正如bruno所说,解析器可以直接配置为正确的编码。这将避免这种肮脏的编码混乱。。。在

^{pr2}$

相关问题 更多 >