编码地狱 - \ u2019不会映射

时间:2015-12-17 21:59:06

标签: python unicode encoding python-requests

我知道这类问题已经被打死了。我已经阅读了我能找到的所有内容,我理解了这个问题(或者至少我认为是这样),而我仍然无法弄清楚这里发生了什么。这个问题一再发生,让我疯了。

一个例子是从以下方面刮取联邦假期: https://www.opm.gov/policy-data-oversight/snow-dismissal-procedures/federal-holidays/'

如果我尝试打印表数据文本,sublime chokes(无输出)和powershell给我一个编码错误(不能编码\ 2019 - 这是一个右撇号)。网站上的标题说UTF-8,它请求正确检测并用作编码(requests.get(url).encoding),所以我有点不知所措。虽然我可以理解powershell失败,因为它使用更窄的unicode标准(cp437 IIRC),我不明白sublime显示没有输出,因为它默认为UTF-8 afaik。

这是一个简单的简单示例,其中base_url是上面列出的主要URL(或者在源页面上的任何后续年份)。 FWIW我几乎只在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))

1 个答案:

答案 0 :(得分:1)

点击这里我做了什么:

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的投诉后,与requests相同,但当然没有区别:

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结束