2014-04-13 18 views
14

Tôi muốn thao tác các thông tin tại THIS url. Tôi có thể mở nó thành công và đọc nội dung của nó. Nhưng những gì tôi thực sự muốn làm là ném ra tất cả những thứ tôi không muốn, và để thao tác những thứ tôi muốn giữ.Parsing phản hồi HTTP bằng Python

Có cách nào để chuyển đổi chuỗi thành một dict để tôi có thể lặp trên nó? Hoặc tôi chỉ cần phải phân tích nó như là (str loại)?

from urllib.request import urlopen 

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json' 
response = urlopen(url) 

print(response.read()) # returns string with info 

Trả lời

38

Điều này đã được giải quyết.

Khi tôi in response.read() Tôi nhận thấy rằng b được đặt trước được chuyển thành chuỗi (ví dụ: b'{"a":1,..). Chữ "b" là viết tắt của byte và đóng vai trò như một khai báo cho kiểu đối tượng bạn đang xử lý. Kể từ khi, tôi biết rằng một chuỗi có thể được chuyển đổi thành một dict bằng cách sử dụng json.loads('string'), tôi chỉ cần chuyển đổi loại byte thành một loại chuỗi. Tôi đã làm điều này bằng cách giải mã phản hồi cho utf-8 decode('utf-8'). Một khi nó đã được trong một loại chuỗi vấn đề của tôi đã được giải quyết và tôi đã dễ dàng có thể lặp qua các dict.

Tôi không biết nếu điều này là hầu hết các cách 'pythonic' viết này nhanh nhất hay nhưng nó hoạt động và theres luôn thời gian sau đó tối ưu hóa và nâng cao! Mã đầy đủ cho giải pháp của tôi:

from urllib.request import urlopen 
import json 

# Get the dataset 
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json' 
response = urlopen(url) 

# Convert bytes to string type and string type to dict 
string = response.read().decode('utf-8') 
json_obj = json.loads(string) 

print(json_obj['source_name']) # prints the string with 'source_name' key 

Nếu có ai tìm thấy điều này thông qua Google, tôi hy vọng điều này sẽ hữu ích. Lời khuyên tốt nhất tôi có thể đưa ra là, đọc kỹ các lỗi của bạn và chú ý đến đầu ra bạn nhận được.

-1

Tôi đoán mọi thứ đã thay đổi trong python 3.4. Điều này làm việc cho tôi:

print("resp:" + json.dumps(resp.json())) 
+2

không có thuộc tính 'json'. Đừng nhầm lẫn giữa thư viện 'requests' và' urllib.request'. – jfs

4

json làm việc với văn bản Unicode trong Python 3 (định dạng JSON tự được xác định duy nhất về văn bản Unicode) và do đó bạn cần phải giải mã byte nhận được trong phản ứng HTTP. r.headers.get_content_charset('utf-8') được bạn mã hóa ký tự:

#!/usr/bin/env python3 
import io 
import json 
from urllib.request import urlopen 

with urlopen('https://httpbin.org/get') as r, \ 
    io.TextIOWrapper(r, encoding=r.headers.get_content_charset('utf-8')) as file: 
    result = json.load(file) 
print(result['headers']['User-Agent']) 

Nó không phải là cần thiết để sử dụng io.TextIOWrapper đây:

#!/usr/bin/env python3 
import json 
from urllib.request import urlopen 

with urlopen('https://httpbin.org/get') as r: 
    result = json.loads(r.read().decode(r.headers.get_content_charset('utf-8'))) 
print(result['headers']['User-Agent']) 
+0

Trong Python 3, sử dụng 'r.msg.get_content_charset'. https://docs.python.org/3/library/http.client.html#http.client.HTTPResponse.msg –

+0

@ PeppeL-G: từ 'HTTPResponse' nguồn: * "' headers' được sử dụng ở đây và hỗ trợ 'urllib'.' msg' được cung cấp dưới dạng lớp tương thích ngược cho các máy khách http. "* – jfs

+0

Ồ, xin lỗi, tôi không có nhiều kinh nghiệm về Python, nhưng có lẽ bạn đã đúng. Tôi đã làm việc với lớp 'HTTPResponse' từ mô-đun' http.client', và bây giờ tôi thấy có một số khác biệt (lớp này chứa cả trường 'msg' và trường' headers' (cùng giá trị), nhưng tôi chỉ tìm thấy tài liệu cho trường 'msg', vì vậy tôi cho rằng' tiêu đề' được giữ cho khả năng tương thích ngược Lỗi của tôi –

6

Bạn cũng có thể sử dụng thư viện yêu cầu python để thay thế.

import requests 

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'  
response = requests.get(url)  
dict = response.json() 

Bây giờ bạn có thể thao tác "dict" như từ điển python.

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