Python 2.7中的Unicode Cyrillic字符串

时间:2017-01-31 14:33:28

标签: python unicode encoding python-2.x cyrillic

我有一段Python 2.7代码,它返回以UTF-8编码的网页。 它基本上是这样做的:

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

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

imgtags=map(lambda x: {'template_tag':False,'tag_type':'img','page_id':record.id,'src_value':x.attrib.get("src",""),'seo_a_title_text': x.attrib.get("title",""),'seo_text': x.attrib.get("alt","")}, tree.findall(".//img"))

问题在于,生成的代码会返回此项,其中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 -*-

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

2 个答案:

答案 0 :(得分:2)

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

Utf8使用一个或多个字节对字符进行编码,例如:Ш(在unicode表中具有位置0x0428,将在utf8中编码为\xd0\xa8)。< / p>

现在是棘手的部分,你得到一个utf8字符串作为unicode字符串。在正确应用utf8之前,需要将其转换为字节。 一个技巧是使用ISO 8859-1(也称为Latin-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所说,解析器可以直接配置正确的编码。这样可以避免这种脏编码丛林...

parser = etree.HTMLParser(encoding='utf8')

答案 1 :(得分:-1)

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']