2017-07-15 58 views
0

全部,通常我的api返回json,但有時會返回完整的響應對象?

我有一個腳本,用於從Web服務器獲取JSON。簡單如下所示:

url = "foo.com/json" 
response = requests.get(url).content 
data = json.loads(response) 

但我注意到的是,有時候不是返回JSON對象,它會返回一個看起來像一個響應轉儲。看到這裏:https://pastebin.com/fUy5YMuY

讓我困惑的是如何繼續。

現在我把上面的蟒蛇裹它

try: 
    url = "foo.com/json" 
    response = requests.get(url).content 
    data = json.loads(response) 
except Exception as ex: 
    with open("test.txt", "w") as t: 
     t.write(response) 
    print("Error", sys.exc_info()) 

有沒有辦法趕上這個?現在我得到一個ValueError ...然後重新解析它?我當時就想,這樣做:

except Exception as ex: 
    response = reparse(response) 

但進出口仍然困惑,爲什麼它有時會返回JSON和其他時候,頭信息+內容。

def reparse(response): 
    """ 
    Catch the ValueError and attempt to reparse it for the json contnet 
    """ 

我可以將類似pastebin轉儲的東西加入到某種請求中嗎。應答類還是類似的?

編輯這是我得到的完整堆棧跟蹤。

response = requests.get(url).content 

這是因爲奇大部分時間,效應初探將返回一個JSON對象,它是完全可解析:

File "scrape_people_by_fcc_docket.py", line 82, in main 
    json_data = get_page(limit, page*limit) 
File "scrape_people_by_fcc_docket.py", line 13, in get_page 
    data = json.loads(response) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 369, in decode 
    raise ValueError(errmsg("Extra data", s, end, len(s))) 
ValueError: Extra data: line 2 column 1 - line 16 column 367717 (char 3 - 368222) 
None 

在上面的代碼中,response變量由下式定義。

理想情況下,我一直在試圖找到一種方法,當內容沒有JSON時,通過一些如何解析它的實際內容,然後繼續。

+0

pastebin圖像確實看起來不像請求轉儲。這是來自API的合理迴應。 –

+0

當你做json.loads值錯誤來了嗎?如果是這樣,然後發佈完整的追溯 –

+0

@ArpitSolanki通常它只是返回我JSON操縱。當我遇到這個錯誤時,它說:*數值錯誤,額外的數據行A列 - 嶺B列B *。 我注意到的差異是'x.content'會返回純JSON,現在它也會返回標題數據。這是不尋常的..它返回錯誤類似於:https://stackoverflow.com/questions/21058935/python-json-loads-shows-valueerror-extra-data但它指向我的'json.loads()'功能 – Fallenreaper

回答

0

而不是使用.text.content您可以使用響應方法:.json(),目前爲止,這似乎解決了我的問題。我正在做不斷的測試和觀察錯誤,並會根據需要更新,但似乎json函數將返回我需要的數據而沒有標題,並且同樣已經調用json.loads或類似語句來解析信息。