Xml python请求分块响应

Xml python请求分块响应,xml,python-requests,chunked-encoding,Xml,Python Requests,Chunked Encoding,我正在使用Python请求包编写一个简单的rest客户端。 这是我的密码- r = requests.get(url, auth=(user, passwd), stream=True, verify=False) print('headers: ') pprint.pprint(r.headers) print('status: ' + str(r.status_code)) print('text: ' + r.text) 这是输出- headers: {'content-typ

我正在使用Python请求包编写一个简单的rest客户端。 这是我的密码-

r = requests.get(url, auth=(user, passwd), stream=True, verify=False)
print('headers: ')
pprint.pprint(r.headers)
print('status: ' + str(r.status_code))
print('text: ' + r.text)
这是输出-

headers: 
    {'content-type': 'text/xml;charset=UTF-8',
     'date': 'Thu, 16 May 2013 03:26:06 GMT',
     'server': 'Apache-Coyote/1.1',
     'set-cookie': 'JSESSIONID=779FC39...5698; Path=/; Secure; HttpOnly',
     'transfer-encoding': 'chunked'}
status: 200

Traceback (most recent call last):
  File "C:\...\client.py", line 617, in _readinto_chunked
    chunk_left = self._read_next_chunk_size()
  File "C:\...\client.py", line 562, in _read_next_chunk_size
    return int(line, 16)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid continuation byte
对该请求的响应是XML。看起来像是大块的。
有没有一种特殊的方式来阅读分块的回答?我想将整个XML响应放在一个字符串中。

只有在计划迭代响应内容时,才使用
stream=True
。如果您计划立即打印响应内容,则
stream=True
不会给您带来任何性能优势。它只会延迟将内容加载到内存中,直到您调用
r.text
r.content
然后将其加载到内存中。如果要防止将整个内容加载到内存中,请检查以下内容。对于其他问题,请尝试以下方法:

print('text:')
print(r.text)

如果您使用的是2.x,
r.text
是一个unicode对象,可能无法转换为ASCII

我不太清楚为什么如果没有
stream=True
,分块回答就不起作用,但正确使用它的唯一方法(不必像你使用
r.content
r.text
)是使用
iter\u content
iter\u行
。要将所有响应内容收集到一个字符串中,可以执行以下操作:

contents = ''.join(r.iter_content(224))  # stole the number from your comment
请注意:对返回的字符串使用
decode
方法将提供高度不一致的结果。如果您的API允许,它将发送
接受编码
头,这样您就可以始终确保返回可以解码的数据


您还没有这样做,所以我没有建议您这样做,但是如果您坚持打印信息,那么您将需要它,特别是如果它是一个国际流行网站的API。

抱歉,但是您关于流的声明是不正确的。Requests documentation—“默认情况下,当您发出请求时,会立即下载响应正文。您可以覆盖此行为并推迟下载响应正文,直到您使用stream参数访问response.content属性”继续-对分块响应不使用“stream=true”会导致非常奇怪的错误,如我上面所示。我刚刚试过,我得到了这个错误-“UnicodeDecodeError:'utf-8'编解码器无法解码位置2:无效起始字节中的字节0x96”我尝试了您提到的其他选项,得到了相同的错误。但是,这是有效的-rString=r.raw.read(224).decode()这里,224表示响应字节长度。@我知道的问题是
stream=True
不会导致
UnicodeDecodeError
。这是服务器和您之间的编码问题(即,试图打印数据)。无论如何,我更新了我的答案,用一种方法将所有响应收集到一个字符串中。它有一些编码/响应问题。我将接受上述答案,因为这是最接近我们得到的解决方案。
contents = ''.join(r.iter_content(224))  # stole the number from your comment