Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编码地狱-\u2019韩元';t图_Python_Unicode_Encoding_Python Requests - Fatal编程技术网

Python 编码地狱-\u2019韩元';t图

Python 编码地狱-\u2019韩元';t图,python,unicode,encoding,python-requests,Python,Unicode,Encoding,Python Requests,我知道这类问题已经被打死了。我已经阅读了所有我能找到的东西,我理解这个问题(或者至少我认为我理解),但我仍然不知道这里发生了什么。这个问题反复出现,让我发疯 一个例子是取消联邦假日: 如果我试图打印表格数据文本,升华阻塞(无输出),powershell会给我一个编码错误(无法编码\2019-这是一个右撇号)。网站上的标题是UTF-8,请求正确地检测并用作编码(requests.get(url).encoding),所以我有点不知所措。虽然我可以理解powershell的失败,因为它使用的是更窄

我知道这类问题已经被打死了。我已经阅读了所有我能找到的东西,我理解这个问题(或者至少我认为我理解),但我仍然不知道这里发生了什么。这个问题反复出现,让我发疯

一个例子是取消联邦假日:

如果我试图打印表格数据文本,升华阻塞(无输出),powershell会给我一个编码错误(无法编码\2019-这是一个右撇号)。网站上的标题是UTF-8,请求正确地检测并用作编码(
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。你真的认为这有什么不同吗?无论如何,谢谢你的否决票。这可能与我的答案不正确或与问题无关有关?