从httplib GET解码内容

时间:2013-08-29 13:15:43

标签: python http encoding

我正在获取CP-1250中的一个简单的HTTP纯文本(我无法影响它)并想要解码它,每行处理它并最终将其保存为UTF-8。

第一部分是给我带来麻烦。在使用response.read()获取原始数据后,我将其传递给getreader("cp1250")从编解码器库创建的读者。我希望得到一个StreamReader实例,只需调用readlines就可以得到一个字节字符串列表。

import codecs
import httplib

# nothing unusual
conn = httplib.HTTPConnection('server')
conn.request('GET', '/')
response = conn.getresponse()
content = response.read()

# the painful part
sr = codecs.getreader("cp1250")(content)
lines = sr.readlines()      # d'oh!

但是在调用readlines之后,我只能从编解码器内部的某个地方回应大喊:

[...snip...]
  File "./download", line 123, in _parse
    lines = sr.readlines()
  File "/usr/lib/python2.7/codecs.py", line 588, in readlines
    data = self.read()
  File "/usr/lib/python2.7/codecs.py", line 471, in read
    newdata = self.stream.read()
AttributeError: 'str' object has no attribute 'read'

我的print确认sr是StreamReader的实例;它让我感到困惑的是,对象似乎初始化得很好但现在却无法执行readlines ......这里缺少什么?

或者图书馆是否试图以密码方式告诉我数据已损坏(不是CP-1250)?

编辑:正如jorispilot建议的那样,unicode(content, encoding="cp1250")有效,所以我可能会坚持使用它来解决问题。但是,我仍然想知道我使用编解码器库时出了什么问题。

2 个答案:

答案 0 :(得分:2)

utf8_lines = []
for line in content.split('\n'):
   line = line.strip().decode('cp1250')
   utf8_lines.append(line.encode('utf-8'))

答案 1 :(得分:1)

根据http://docs.python.org/2/library/codecs.htmlgetreader()会返回StreamReader。这必须传递一个实现read()函数的流,而不是像你一样传递一个字符串。

要解决此问题,请不要阅读response中的数据,而是直接将其传递给StreamReader,如下所示。

conn = httplib.HTTPConnection('server')
conn.request('GET', '/')
response = conn.getresponse()

reader = codecs.getreader("cp1250")(response)
lines = sr.readlines()