2015-07-29 14 views
9

Về cơ bản tôi đã yêu cầu một trang web và nhận phản hồi byte: b'[{"geonameId:"703448"}..........'. Tôi bị nhầm lẫn vì mặc dù nó thuộc loại byte, rất dễ đọc và xuất hiện một danh sách các json. Tôi biết rằng các phản ứng được mã hóa trong latin1 từ chạy r.encoding mà trở về ISO-859-1 và tôi đã cố gắng giải mã nó, nhưng nó chỉ trả về một chuỗi rỗng. Dưới đây là những gì tôi có cho đến thời điểm này:Yêu cầu trả về byte và tôi không giải mã được

r = response.content 
string = r.decode("ISO-8859-1") 
print (string) 

và đây là nơi nó in một dòng trống. Tuy nhiên khi tôi chạy

len(string) 

tôi nhận được: trở lại 31023 Làm thế nào tôi có thể giải mã các byte mà không nhận lại một chuỗi rỗng?

+0

trong python 2.x tiền tố b sẽ làm cho chuỗi kèm theo để trở thành một loại 'str' bạn có thể có một số ký tự được mã hóa đã ẩn ở đâu đó bên trong. Trên Python 3.x bạn sẽ nhận được một 'byte' chữ. tại sao bạn tin rằng bạn cần thực hiện bất kỳ mã hóa/giải mã nào? –

+0

Bởi vì tôi cần phải phân tích cú pháp của json, và tôi đã thử lặp lại nó: với 'for i in range (len (nội dung)): in nội dung [i]' và nó chỉ in ra rất nhiều con số. –

Trả lời

7

Bạn đã cố phân tích cú pháp với mô-đun json?

import json 
parsed = json.loads(response.content) 
+1

Có và tôi nhận được: 'Đối tượng JSON phải là str, không phải 'byte'' –

+0

Và khi bạn thực hiện' json.loads (response.content.decode (' latin1 ')) '? – mzc

+0

Điều này đã làm các trick. Cảm ơn! –

8

Một giải pháp khác là sử dụng response.text, mà trả về nội dung trong unicode

Type:  property 
String form: <property object at 0x7f76f8c79db8> 
Docstring: 
Content of the response, in unicode. 

If Response.encoding is None, encoding will be guessed using 
``chardet``. 

The encoding of the response content is determined based solely on HTTP 
headers, following RFC 2616 to the letter. If you can take advantage of 
non-HTTP knowledge to make a better guess at the encoding, you should 
set ``r.encoding`` appropriately before accessing this property. 
+2

Đây là một ý tưởng tốt hơn nhiều so với câu trả lời được chấp nhận, vì nó sẽ sử dụng mã hóa thích hợp. – drevicko

+1

Có, đây là những gì được đề xuất trong tài liệu: http://docs.python-requests.org/en/master/user/quickstart/#response-content –

Các vấn đề liên quan