将包含UTF-8字符串内容的Unicode转换为str

11 投票
1 回答
54329 浏览
提问于 2025-04-17 13:45

我正在使用pyquery来解析一个网页:

dom = PyQuery('http://zh.wikipedia.org/w/index.php', {'title': 'CSS', 'printable': 'yes', 'variant': 'zh-cn'})
content = dom('#mw-content-text > p').eq(0).text()

但是我在content中得到的是一个包含utf-8编码内容的unicode字符串:

u'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8...'

我该如何将它转换成str而不丢失内容呢?

为了更清楚:

我想要的是conent == '\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'

而不是conent == u'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'

1 个回答

29

如果你有一个包含UTF-8字节的unicode值,可以把它编码成Latin-1,这样就能保留这些'字节':

content = content.encode('latin1')

这是因为Unicode中的代码点U+0000到U+00FF和Latin-1编码一一对应,所以这种编码方式会把你的数据当作字节来处理。

根据你的例子,这样处理后我得到:

>>> content = u'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'
>>> content.encode('latin1')
'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'
>>> content.encode('latin1').decode('utf8')
u'\u5c42\u53e0\u6837\u5f0f\u8868'
>>> print content.encode('latin1').decode('utf8')
层叠样式表

PyQuery会使用requestsurllib来获取HTML内容,在使用requests的情况下,它会用响应的.text属性。这个属性会根据Content-Type头部中设置的编码自动解码响应数据,如果没有这个信息,它会默认使用latin-1来处理(对于文本响应来说,HTML也是一种文本响应)。你可以通过传入encoding参数来覆盖这个默认设置:

dom = PyQuery('http://zh.wikipedia.org/w/index.php', encoding='utf8',
              {'title': 'CSS', 'printable': 'yes', 'variant': 'zh-cn'})

这样一来,你就完全不需要重新编码了。

撰写回答