تحليل استجابة HTTP في بايثون
-
21-12-2019 - |
سؤال
أريد معالجة المعلومات في هذا عنوان URL.يمكنني فتحه بنجاح وقراءة محتوياته.لكن ما أريد فعله حقًا هو التخلص من كل الأشياء التي لا أريدها، والتلاعب بالأشياء التي أريد الاحتفاظ بها.
هل هناك طريقة لتحويل السلسلة إلى إملاء حتى أتمكن من التكرار عليها؟أم هل عليّ فقط تحليلها كما هي (نوع str)؟
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
المحلول
عندما طبعت response.read()
لاحظت ذلك b
تم تقديمه مسبقًا إلى السلسلة (على سبيل المثال b'{"a":1,..
).يشير الحرف "b" إلى البايتات ويعمل بمثابة تعريف لنوع الكائن الذي تتعامل معه.منذ ذلك الحين، كنت أعرف أنه يمكن تحويل السلسلة إلى إملاء باستخدام json.loads('string')
, ، كان عليّ فقط تحويل نوع البايت إلى نوع سلسلة.لقد فعلت ذلك عن طريق فك تشفير الاستجابة لـ utf-8 decode('utf-8')
.بمجرد وجوده في نوع سلسلة، تم حل مشكلتي وتمكنت بسهولة من التكرار عبر ملف dict
.
لا أعرف ما إذا كانت هذه هي الطريقة الأسرع أو الأكثر "بيثونية" لكتابة هذا ولكنها تعمل وهناك دائمًا وقت لاحق للتحسين والتحسين!الكود الكامل للحل الخاص بي:
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
نصائح أخرى
يمكنك أيضا استخدام مكتبة طلبات Python بدلا من ذلك.
giveacodicetagpre.الآن يمكنك التعامل مع "Dict" مثل قاموس Python.
json
يعمل مع نص Unicode في Python 3 (يتم تعريف تنسيق JSON نفسه فقط من حيث نص Unicode) وبالتالي تحتاج إلى فك تشفير البايتات المستلمة في استجابة HTTP. r.headers.get_content_charset('utf-8')
يحصل على ترميز الأحرف الخاص بك:
#!/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'])
ليس من الضروري استخدامه io.TextIOWrapper
هنا:
#!/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'])
أعتقد أن الأمور قد تغيرت في بيثون 3.4.هذا عملت بالنسبة لي:
giveacodicetagpre.