-1

データを反復処理してログインのみをダウンロードしたいのですが、次のエラーが発生します。

print elem["login"]
TypeError: string indices must be integers, not str

私のコード:

import requests
import json
import csv
import urllib

 def printContents(path):
    filein = open(path, 'r')
    instr = filein.read()
    filein.close()
 printContents("top_story_2012.txt")
 appkey = "...."
 url= "http://a.wykop.pl/ludzie/followers/"
 wykopff = open("top_story_2012.txt", 'r')
 names = [line.strip() for line in wykopff.readlines()]
 for i in names:
    p = urllib.urlopen(url + i + "/appkey/" + appkey)
    wykops = p.read()
    read = json.loads(wykops)
    for elem in wykops:
        print elem["login"]

「ログイン」を整数に変更しようとしました:

   print elem[int("login")]

それがその方法であるかどうかはわかりませんが、それでも機能せず、次のエラーが表示されます。

 ValueError: invalid literal for int() with base 10: 'login'

反復しようとしているコンテンツは次のようになります。

  {"login":"Josif6969","email":"a9a4525e207fcba3ac0fc221246439a3:3670009297","public_email":"","name":"","www":"","jabber":"","gg":"","city":"","about":"Hobby: Obserwator.","author_group":1,"links_added":82,"links_published":4,"comments":132,"rank":0,"followers":       
4

1 に答える 1

0

read代わりに、デコードされた JSON 構造であるをループします。

wykops = p.read()
read = json.loads(wykops)
for elem in read:
    print elem["login"]

json.load()または、代わりに使用するために単純化します。

for elem in json.load(p):
    print elem["login"]

これは、呼び出しからのデータがリストであることを前提としていますjson.load()が、代わりに結果を辞書として扱いたかっただけだと思います。

data = json.load(p):
print data["login"]

一部の応答が代わりにリストを返すように (コメントから) 聞こえます。何が起こっているのかを理解するためにこれを試してください:

data = json.load(p):
try:
    print data["login"]
except TypeError:
    # not a dictionary, so what is it *then*?
    print "Not a dictionary:", data

あなたのコードは代わりにJSONデータ文字列を1文字ずつループしていたので["login"]、Python文字列に適用しようとしていました:

>>> 'somestring'["login"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string indices must be integers, not str
于 2013-03-26T11:45:57.870 に答える