Python:难以将ascii转换为unicode

时间:2015-06-02 21:31:11

标签: python unicode encoding utf-8

我的目标:从网址获取网页来源并计算该网页来源中关键字的所有实例

我是怎么做的:通过urllib2获取pagesource,遍历页面源的每个char并将其与关键字进行比较

我的问题:我的关键字是用utf-8编码的,而页面源是ascii ...我尝试转换时遇到错误。

获取页面来源:

import urllib2
response = urllib2.urlopen(myUrl)
return response.read()

比较页面来源和关键字:

pageSource[i] == keyWord[j]

我需要将其中一个字符串转换为其他字符串的编码。直觉上我觉得utc-8(关键词)的ascii(页面源)将是最好和最简单的,所以:

    pageSource = unicode(pageSource)
UnicodeDecodeError: 'ascii' codec can't decode byte __ in position __: ordinal not in range(128)

2 个答案:

答案 0 :(得分:2)

尝试处理文字时,请不要将数据保留为字节字符串。尽早解码为Unicode,尽可能晚地编码回字节。

解码下载的网络数据:

import urllib2

response = urllib2.urlopen(myUrl)
# Latin-1 is the default for HTTP text/ responses, adjust as needed
codec = response.info().getparam('charset', 'latin1')
return response.read().decode(codec)

并为您的keyWord数据执行相同的操作。如果它被编码为UTF-8,则将其解码,或使用Unicode字符串文字。

您可能想要阅读Python和Unicode:

答案 1 :(得分:0)

我假设您的远程"源页面"包含的不仅仅是ASCII,否则您的比较将按原样运行(ASCII现在是UTF-8的子集。即ASCII中的A是0x41,与UTF-8相同)。

您可以更轻松地找到Python Requests库,因为它会根据服务器的标头自动将远程内容解码为Unicode字符串(Unicode字符串编码为中性,因此可以进行比较而无需担心编码)。 / p>

resp = requests.get("http://www.example.com/utf8page.html")
resp.text
>> u'My unicode data €'

然后,您需要解码参考数据:

keyWord[j] = "€".decode("UTF-8")
keyWord[j]
>> u'€'

如果您在源代码中嵌入非ASCII,则需要定义您正在使用的编码。例如,在源代码/脚本的顶部:

# coding=UTF-8