我和编码挣扎的时间太长了,今天我要打破心理障碍敞开的。如何使用Python来处理编码请求库
现在,我正在使用Requests来刮掉一堆网站,并且从我可以告诉它使用HTTP标头中找出网页正在使用的编码,当网站的标头回落到chardet时缺失。从那里开始,它解码下载的字节码,然后在r.text
帮忙给我一个unicode对象。
一切都好。
但是,在我感到困惑的是,从那里我做了一些文字工作,然后打印出来到标准输出,提供了编码当我打印:
print foo.encode('utf-8')
的问题是,当我做那印刷的东西就搞砸了。在下文中,我期望能获得这个词“判断”和“标准”之间的emdash:
Declaratory judgmentsStandard of review.
相反,我得到它的四个微小的数字四四方方的东西。它似乎并没有在这里显示,当然了,但我认为这些数字是0097,这相当于我所得到的,如果我这样做:
repr(foo)
u'Declaratory judgments\x97Standard of review.'
所以那种有道理的,但在那里是我的emdash?
的过程归结为:
- 请求下载一个网页和智能文本到Unicode对象
- 我用它工作
- 我把它编码成UTF-8和打印解码出来。
在哪里的问题?这听起来像是我的mythical unicode sandwich,但显然我错过了一些东西。
是!你钉了它。 [页面](http://www.sconet.state.oh.us/ROD/docs/default.asp?Page=1&Sort=docdecided%20DESC&PageSize=25&Source=0&iaFilter=2012&ColumnMask=669)是问题所在。它没有声明编码,因此chardet将其识别为“ISO-8859-1”,并且请求将其解码。然后,当我编码为UTF-8,当然也失败了。你是怎么知道这一点的?我想在未来避免这种情况? – mlissner 2012-07-21 00:41:37
哦,还有一个问题...... Firefox和Chrome浏览器也检测到这个页面为iso-8859-1 ......但它们完美地显示了emdashes!他们的伎俩是什么? – mlissner 2012-07-21 00:44:42
长时间的经验告诉我,在\ x9X编码的字符如emdash可能是cp1252。查看维基百科确认cp1252将您显示的字节映射到您期望的字符。 cp1252实际上是iso8859-1的超集,其中iso8859-1没有可打印的字符。所以当浏览器说他们使用8859-1时,他们实际上使用了cp1252,因为为什么不呢,它只是让更多的字符可打印。 – 2012-07-21 00:46:48