Python 编码地狱-\u2019韩元';t图
我知道这类问题已经被打死了。我已经阅读了所有我能找到的东西,我理解这个问题(或者至少我认为我理解),但我仍然不知道这里发生了什么。这个问题反复出现,让我发疯 一个例子是取消联邦假日: 如果我试图打印表格数据文本,升华阻塞(无输出),powershell会给我一个编码错误(无法编码\2019-这是一个右撇号)。网站上的标题是UTF-8,请求正确地检测并用作编码(Python 编码地狱-\u2019韩元';t图,python,unicode,encoding,python-requests,Python,Unicode,Encoding,Python Requests,我知道这类问题已经被打死了。我已经阅读了所有我能找到的东西,我理解这个问题(或者至少我认为我理解),但我仍然不知道这里发生了什么。这个问题反复出现,让我发疯 一个例子是取消联邦假日: 如果我试图打印表格数据文本,升华阻塞(无输出),powershell会给我一个编码错误(无法编码\2019-这是一个右撇号)。网站上的标题是UTF-8,请求正确地检测并用作编码(requests.get(url).encoding),所以我有点不知所措。虽然我可以理解powershell的失败,因为它使用的是更窄
requests.get(url).encoding
),所以我有点不知所措。虽然我可以理解powershell的失败,因为它使用的是更窄的unicode标准(cp437 IIRC),但我不理解升华没有显示输出,因为它默认为UTF-8 afaik
下面是一个简单的例子,其中base_url是上面列出的主url(或者您进入源页面后的任何一年)。FWIW我几乎只在Windows上遇到这些问题,我必须在工作中使用Windows
def get_year(url):
source = requests.get(url,proxies=proxies)
doc = html.fromstring(source.text)
td=doc.xpath('//td/text()')
return td
print(get_year(base_url))
看看我做了什么:
import urllib
url = 'https://www.opm.gov/policy-data-oversight/snow-dismissal-procedures/federal-holidays/'
data = urllib.urlopen(url).read()
udata = unicode(data,'utf-8')
编辑开始
关于使用urllib
的投诉之后,请求的情况也一样,当然没有区别:
source = requests.get(url)
udata = source.text
编辑结束
没有编码错误或任何其他问题。
我搜索了非ASCII字符。只有一个:\xA0
位于索引53513
那里没有\2019
字符!但是,也有代码>,翻译为相同的
因此,您正在使用的一个库似乎已经转换了
到\2019
,但编码错误,因此创建了无效字符串。后来,它在另一个地方坠毁了。所有这些都是在下载之后发生的。您应该跟踪下载的数据发生了什么,以查看哪个函数执行了该操作。然后看看它的文档是怎么说的
编辑2开始
按照最初的代码,我来到了最后一行print(get_year(base_url))
引发异常的地方
通过检查,如上文所述,lxml
已转换为代码>至\2019
,因此我们有:
>>> s = get_year(base_url)[1]
>>> s
u'New Year\u2019s Day'
如果控制台的编码不支持\u2019
字符,则将其打印到控制台失败。在windows上,通常情况就是这样
编辑2-END你说得对,任何编码到UTF-8的操作都应该成功。您能显示完整的错误堆栈吗?您是否尝试过更改请求-应答的编码?i、 例如,source.encoding='utf-8'
如果您自己对字符串进行编码,则可以设置“忽略”或“替换”错误策略。我不知道如何更改print
的编码器,但是(可能是蹩脚但功能性的)解决方案可能是print(get_year(base_url)。encode(sys.stdout.encoding,errors='replace')。decode(sys.stdout.encoding))
@和foy yes-但这并不重要,因为请求已经默认将编码设置为utf-8(它根据http头进行猜测,该站点的http头是utf-8).Mark Ransom-sublime中没有错误,它只是以空白结束。对于powershell,错误在于编码的字符无法编码\u2019。我猜您的问题是在尝试打印时解码unicode字符。Windows确实有unicode代码页,但安装时通常不会设置这些代码页,并且很难更改为打开正在运行的系统(想象一下,所有写入代码页的数据突然不再工作)。您可以通过运行chcp 65001
来切换到utf-8进行控制台会话。尝试一下,然后运行sublime,看看大家是否都满意。您在哪种类型的机器上进行了测试?它是带有windows代码页而不是utf-8的windows命令提示符吗?您可以通过打印(sys.stdout.encoding)进行检查
。关于使用请求的问题非常具体,为什么要尝试使用urllib
复制问题?@MarkRansom我编辑了我的答案。与requests
@tdelaney没有区别。我使用了从windows控制台启动的python控制台,在windos 7上,sys.stdout。编码是cp852代码>。你真的认为这有什么不同吗?无论如何,谢谢你的否决票。这可能与我的答案不正确或与问题无关有关?