0

我正在获取 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")有效,所以我可能会坚持使用它作为我的解决方案。但是,我仍然想知道我对编解码器库的使用有什么问题。

4

2 回答 2

2
utf8_lines = []
for line in content.split('\n'):
   line = line.strip().decode('cp1250')
   utf8_lines.append(line.encode('utf-8'))
于 2013-08-29T13:37:48.887 回答
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()
于 2013-08-29T13:45:05.673 回答