2014-07-02 14 views
5

Tôi đang cố lấy tiêu đề từ một trang web, mã hóa nó trong JSON để viết nó vào một tệp. Tôi đã thử hai cách khác nhau mà không thành công.Lấy tiêu đề bằng Python và chuyển đổi bằng JSON (yêu cầu - urllib2 - json)

FIRST với urllib2 và json

import urllib2 
import json 
host = ("https://www.python.org/") 
header = urllib2.urlopen(host).info() 
json_header = json.dumps(header) 
print json_header 

theo cách này tôi nhận được lỗi:

TypeError: is not JSON serializable

Vì vậy, tôi cố gắng để vượt qua vấn đề này bằng cách chuyển đổi các đối tượng thành một chuỗi -> json_header = str (tiêu đề) Bằng cách này tôi có thể json_header = json.dumps (tiêu đề) nhưng đầu ra nó lạ:

"Date: Wed, 02 Jul 2014 13:33:37 GMT\r\nServer: nginx\r\nContent-Type: text/html; charset=utf-8\r\nX-Frame-Options: SAMEORIGIN\r\nContent-Length: 45682\r\nAccept-Ranges: bytes\r\nVia: 1.1 varnish\r\nAge: 1263\r\nX-Served-By: cache-fra1220-FRA\r\nX-Cache: HIT\r\nX-Cache-Hits: 2\r\nVary: Cookie\r\nStrict-Transport-Security: max-age=63072000; includeSubDomains\r\nConnection: close\r\n"

THỨ HAI với yêu cầu

import requests 
r = requests.get(“https://www.python.org/”) 
rh = r.headers 
print rh 

{'content-length': '45682', 'via': '1.1 varnish', 'x-cache': 'HIT', 'accept-ranges': 'bytes', 'strict-transport-security': 'max-age=63072000; includeSubDomains', 'vary': 'Cookie', 'server': 'nginx', 'x-served-by': 'cache-fra1226-FRA', 'x-cache-hits': '14', 'date': 'Wed, 02 Jul 2014 13:39:33 GMT', 'x-frame-options': 'SAMEORIGIN', 'content-type': 'text/html; charset=utf-8', 'age': '1619'}

Bằng cách này, đầu ra là JSON giống như nhưng vẫn không OK (xem ‘‘thay cho ““và các công cụ khác như = và;). Rõ ràng có điều gì đó (hoặc rất nhiều) tôi không làm đúng cách. Tôi đã cố gắng đọc tài liệu về các mô-đun nhưng tôi không thể hiểu cách giải quyết vấn đề này. Cảm ơn sự giúp đỡ của bạn.

Trả lời

8

Có hơn một vài cách để mã hóa tiêu đề như JSON, nhưng suy nghĩ đầu tiên của tôi sẽ là để chuyển đổi các thuộc tính headers đến một từ điển thực tế thay vì truy cập nó như requests.structures.CaseInsensitiveDict

import requests, json 
r = requests.get("https://www.python.org/") 
rh = json.dumps(r.headers.__dict__['_store']) 
print rh 

{'content-length': ('content-length', '45474'), 'via': ('via', '1.1 varnish'), 'x-cache': ('x-cache', 'HIT'), 'accept-ranges': ('accept-ranges', 'bytes'), 'strict-transport-security': ('strict-transport-security', 'max-age=63072000; includeSubDomains'), 'vary': ('vary', 'Cookie'), 'server': ('server', 'nginx'), 'x-served-by': ('x-served-by', 'cache-iad2132-IAD'), 'x-cache-hits': ('x-cache-hits', '1'), 'date': ('date', 'Wed, 02 Jul 2014 14:13:37 GMT'), 'x-frame-options': ('x-frame-options', 'SAMEORIGIN'), 'content-type': ('content-type', 'text/html; charset=utf-8'), 'age': ('age', '1483')}

Tùy thuộc vào chính xác những gì bạn muốn trên các tiêu đề, bạn có thể truy cập cụ thể chúng sau này, nhưng điều này sẽ cung cấp cho bạn tất cả các thông tin chứa trong các tiêu đề, nếu trong một định dạng hơi khác nhau.

Nếu bạn thích một định dạng khác, bạn cũng có thể chuyển đổi tiêu đề của bạn vào một từ điển:

import requests, json 
r = requests.get("https://www.python.org/") 
print json.dumps(dict(r.headers)) 

{"content-length": "45682", "via": "1.1 varnish", "x-cache": "HIT", "accept-ranges": "bytes", "strict-transport-security": "max-age=63072000; includeSubDomains", "vary": "Cookie", "server": "nginx", "x-served-by": "cache-at50-ATL", "x-cache-hits": "5", "date": "Wed, 02 Jul 2014 14:08:15 GMT", "x-frame-options": "SAMEORIGIN", "content-type": "text/html; charset=utf-8", "age": "951"}

+0

Cảm ơn bạn rất nhiều @Slater Tyranus. Phương pháp thứ hai của bạn chính xác là những gì tôi đang tìm kiếm. Chỉ một câu hỏi tò mò. Đọc đầu ra của phương thức đầu tiên của bạn Tôi thấy rằng các khóa và giá trị nằm bên trong ''. Tại sao json.dumps làm điều đó trong trường hợp đó? Định dạng JSON hợp lệ có giá trị bên trong "" không? –

1
import requests 
import json 

r = requests.get('https://www.python.org/') 
rh = r.headers 

print json.dumps(dict(rh)) # use dict() 

kết quả:

{"content-length": "45682", "via": "1.1 varnish", "x-cache": "HIT", "accept-ranges": "bytes", "strict-transport-security": "max-age=63072000; includeSubDomains", "vary": "Cookie", "server": "nginx", "x-served-by": "cache-fra1224-FRA", "x-cache-hits": "5", "date": "Wed, 02 Jul 2014 14:08:04 GMT", "x-frame-options": "SAMEORIGIN", "content-type": "text/html; charset=utf-8", "age": "3329"}

+0

Cảm ơn sự giúp đỡ của bạn @furas –

6

Nếu bạn chỉ quan tâm trong tiêu đề, thực hiện yêu cầu head. chuyển đổi CaseInsensitiveDict trong đối tượng dict và sau đó chuyển đổi nó thành json.

import requests 
import json 
r = requests.head('https://www.python.org/') 
rh = dict(r.headers) 
json.dumps(rh) 
Các vấn đề liên quan