2016-03-30 17 views
5

Tôi đang cố gắng lấy khóa từ giá trị mà tôi được trả về, nhưng khi tôi sử dụng cách tiếp cận dễ dàng để chỉ nhận giá trị của một khóa cụ thể tôi nhận được lỗi: LoạiError: chỉ mục chuỗi phải là số nguyên, chứ không phải là sốLoạiError: chuỗi chỉ số phải là số nguyên, không str // Cố gắng lấy giá trị của khóa

Tôi cũng đã thử phương thức .get() nhưng cũng không hoạt động. Ai đó có thể xin vui lòng chỉ cho tôi những gì tôi đang làm sai?

>>> import urllib2 
>>> url = 'http://192.168.250.1/ajax.app?SessionId=8ef05397-ef00-451a-bc1c-c0d61 
5a4811d&service=getDp&plantItemId=1413' 
>>> response = urllib2.urlopen(url) 
>>> dict = response.read() 
>>> dict 
'{"service":"getDp","plantItemId":"1413","value":" 21.4","unit":"\xc2\xb0C"}' 
>>> dict['value'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string indices must be integers, not str 

Trả lời

5

Có vẻ như 'dict' là biến của chuỗi loại, không phải từ điển. Bạn nên phân tích cú pháp chuỗi thành định dạng từ điển phù hợp (như JSON). Dưới đây là một mã sẽ giải quyết vấn đề đó:

import json 
json_string = response.read() 
dict = json.loads(json_string) 

Bây giờ, cho dict['value'] bạn sẽ nhận được những gì bạn cần.

+2

Cần lưu ý rằng điều này sẽ trả về giá trị unicode một cách chính xác cho 'đơn vị' trong khi giải pháp 'literal_eval' sẽ trả về chuỗi byte trên Python 2 hoặc sai trên Python 3. – Duncan

+0

Tôi có thể hỏi tại sao tôi được trả về - u '21.3 - Tại sao "u" đó? – narn

+1

Điều đó có nghĩa là chuỗi ở dạng unicode – Belphegor

4

response.read() đang trở lại một đối tượng kiểu string và không phải là một từ điển và bạn có thể chỉ mục một chuỗi chỉ sử dụng các chỉ số số nguyên và do đó bạn đang nhận được lỗi của bạn.

Bạn cần phải phân tích cú pháp chuỗi này và chuyển đổi nó thành từ điển. Để chuyển đổi chuỗi từ điển trở lại từ điển bạn có thể thực hiện việc này:

import ast 
dict = ast.literal_eval(dict) 
print dict['value'] 

Đã thử trên máy của tôi bằng Python 2.7 và hoạt động.

+0

Nếu văn bản gốc được dự định là json, thì có thể tốt hơn để sử dụng bộ giải mã json thực tế. – Duncan

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