【问题标题】:How to handle encodings using Python Requests library如何使用 Python Requests 库处理编码
【发布时间】:2012-07-21 00:17:25
【问题描述】:

我与编码斗争太久了,今天我想打破思维障碍。

现在,我正在使用 Requests 抓取一堆网站,据我所知,它使用 HTTP 标头来找出页面正在使用的编码,当该网站的标题丢失。从那里,它解码它下载的字节码,然后帮助我在r.text 中提供一个 unicode 对象。

一切都好。

但我感到困惑的是,我从那里对文本进行了一些处理,然后将其打印到标准输出,在我打印时提供编码:

 print foo.encode('utf-8')

问题是,当我这样做时,打印出来的东西就搞砸了。在下文中,我希望在“判断”和“标准”这两个词之间加一个破折号:

 Declaratory judgmentsStandard of review.

相反,我得到了一个四四方方的东西,里面有四个小数字。当然,它似乎没有出现在这里,但我认为数字是 0097,这与我得到的结果相对应:

repr(foo)
u'Declaratory judgments\x97Standard of review.'

这么说是有道理的,但我的 emdash 呢?

这个过程归结为:

  1. 请求下载页面并将文本智能解码为 un​​icode 对象
  2. 我使用它
  3. 我将其编码为 utf-8 并打印出来。

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

【问题讨论】:

    标签: python unicode encoding python-requests


    【解决方案1】:

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

    PS:Unicode 三明治并不是神话,它是一种努力奋斗的理想! :)

    【讨论】:

    • 是的!你搞定了。 page 是问题所在。它没有声明编码,因此 chardet 将其识别为“ISO-8859-1”,Requests 将其解码。然后,当我将其编码为 utf-8 时,当然也失败了。你是怎么知道的?我想在将来避免这种情况吗?
    • 哦,还有一个问题……Firefox 和 Chrome 也将此页面检测为 iso-8859-1……但它们完美地显示了破折号!他们的伎俩是什么?
    • 长期经验告诉我,在 \x9X 处编码的 emdash 等字符可能是 cp1252。在 Wikipedia 上查找确认 cp1252 将您显示的字节映射到您期望的字符。 cp1252 实际上是 iso8859-1 的超集,具有可打印字符,而 iso8859-1 没有。因此,当浏览器说他们使用 8859-1 时,他们实际上使用的是 cp1252,因为为什么不这样做,它只是让更多的字符可打印。
    • 有道理。所以这听起来像是 chardet 或 Requests 中的一个错误。似乎他们可以有一个捕获,说每当他们看到 iso-8859-1,他们应该假设它实际上是 cp1252?
    • 我没有使用 chardet 的经验。我希望如果输入中有一个 \x97 字节,该 chardet 会给你 cp1252 作为结果。你是对的,页面似乎根本没有编码声明,虽然它说它是由 IIS 提供的,所以这是一个线索,虽然晦涩难懂!
    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多