2012-07-21 74 views
5

我和编码挣扎的时间太长了,今天我要打破心理障碍敞开的。如何使用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?

的过程归结为:

  1. 请求下载一个网页和智能文本到Unicode对象
  2. 我用它工作
  3. 我把它编码成UTF-8和打印解码出来。

在哪里的问题?这听起来像是我的mythical unicode sandwich,但显然我错过了一些东西。

回答

4

你在做些奇怪的事情。 \x97cp1252编码中的一个。在Unicode字符串中,它是U+0097 END OF GUARDED AREA。不知何故,你正在读取cp1252字节作为Unicode。显示更多让你进入这个状态的代码,我们可以深入挖掘。

PS:Unicode的三明治几乎神话,它是一种理想的追求! :)

+0

是!你钉了它。 [页面](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

+0

哦,还有一个问题...... Firefox和Chrome浏览器也检测到这个页面为iso-8859-1 ......但它们完美地显示了emdashes!他们的伎俩是什么? – mlissner 2012-07-21 00:44:42

+0

长时间的经验告诉我,在\ x9X编码的字符如emdash可能是cp1252。查看维基百科确认cp1252将您显示的字节映射到您期望的字符。 cp1252实际上是iso8859-1的超集,其中iso8859-1没有可打印的字符。所以当浏览器说他们使用8859-1时,他们实际上使用了cp1252,因为为什么不呢,它只是让更多的字符可打印。 – 2012-07-21 00:46:48