2017-01-06 11 views
0

HTTP応答からデータを取得できません。フォーマットは残念ながら、すべてのキーと値のペアに '\ n'を付けて戻ってきます。 JSONは、 "バイト"ではなくstrでなければならないと言います。HTTPリクエストからJSONを抽出できません。

私のインクルードのリストが奇妙な/冗長に見えるように私はいくつかの修正を試みました。任意の提案をいただければ幸いです。

#!/usr/bin/env python3 

import urllib.request 
from urllib.request import urlopen 
import json 
import requests 

url = "http://finance.google.com/finance/info?client=ig&q=NASDAQ,AAPL" 
response = urlopen(url) 
content = response.read() 
print(content) 

data = json.loads(content) 
info = data[0] 
print(info) 
#got this far - planning to extract "id:" "22144" 
+1

あなたが要求し、[使用](http://stackoverflow.com/questions/16877422/parsing-json-responsesに)それを含めます! –

答えて

3

Pythonでリクエストを行う場合、私は個人的にrequestsライブラリを使いたいと思います。私は使いやすくなっています。

import json 
import requests 

r = requests.get('http://finance.google.com/finance/info?client=ig&q=NASDAQ,AAPL') 
json_obj = json.loads(r.text[4:]) 

print(json_obj[0].get('id')) 

上記の溶液を印刷:r.text[4:]22144

応答データは、私が唯一の応答の関連(JSON)の部分をロードしています理由である、頭で夫婦不要な文字を持っていました。これが最初にjsonとしてロードできなかった理由です。

+0

うん、スラッシュはjsonのデコードを台無しにしていた。 – deweyredman

+0

r.json()を使用すると、@deweyredmanが述べたように、応答に先頭にスラッシュ(無効なjson形式)があるため、エラーが発生します。 –

-1

JSONは、 "バイト"ではなくstrである必要があると言います。

あなたのコンテンツは「バイト」であり、以下のようにすることができます。

data = json.loads(content.decode()) 
+0

これを試しましたか? –

+0

申し訳ありませんが、中国ではGoogleにアクセスできません。つまり、一般的な解決策です。 – lxyscls

+0

ああ、質問からのエラーを説明してくれてよかった。しかし、レスポンスとともに送信される余分な文字のため、これでもエラーが発生します。 –

1

バイトオブジェクトには、バイトを文字列に変換するメソッドdecode()があります。ブラウザの応答を確認すると、文字列の先頭に削除する必要のある余分な文字があるようです(改行文字に続いて2つのスラッシュ '\ n //')。 decode()メソッドによって返された文字列から最初の3文字をスキップするには、メソッド呼び出しの後に[3:]を追加します。

data = json.loads(content.decode()[3:]) 
print(data[0]['id']) 

出力は、あなたが期待する正確に何である:

22144 
関連する問題