String indices Problem mit Twitter API

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fraygeyst
User
Beiträge: 3
Registriert: Mittwoch 22. September 2021, 12:32
Kontaktdaten:

Hi Leute,
ich möchte mithilfe der Twitter API Tweets auslesen und in einer SQLite Datenbank speichern, leider stoße ich hierbei auf ein Problem, das ich nicht gelöst bekomme. Beim fetchen der Tweets, um sie anschließend in der Datenbank abzuspeichern bekomme ich einen TypeError: string indices must be integers Fehler.

Hier die dazugehörigen Codeausschnitte:

Code: Alles auswählen

con = sqlite3.connect("db.db")
cur = con.cursor()

def db():
    with con:
        cur.execute("""CREATE TABLE IF NOT EXISTS User (user_id INTEGER, created_at TEXT, description TEXT, 
        entities TEXT, location TEXT, name TEXT, username TEXT, verified TEXT, followers_count INTEGER, 
        following_count INTEGER, tweet_count INTEGER, listed_count INTEGER, withheld TEXT, protected TEXT, UNIQUE(user_id))""")

Code: Alles auswählen

def insertUser(user_id, created_at, description, entities, location, name, username, verified, 
followers_count, following_count, tweet_count, listed_count, withheld, protected):
    with con:
        cur.execute("INSERT OR IGNORE INTO User VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
                  (user_id, created_at, description, entities, location, name, username, verified, 
                  followers_count, following_count, tweet_count, listed_count, withheld, protected))

Code: Alles auswählen

for t in r:
            user = t['author_id']
            
            print(user)

            insertUser(user['id'], user['created_at'], user['description'], user.get("entities", ""), user.get("location", ""), user['name'], 
            user['username'], user['verified'], user['public_metrics']['followers_count'], user['public_metrics']['following_count'],
            user['public_metrics']['tweet_count'], user['public_metrics']['listed_count'],str(user.get("withheld", "")), user.get("protected", ""))

Hier noch die komplette Konsolenausgabe des Problems:

Traceback (most recent call last):
File "...", line X, in fetchTweets
insertUser(user['id'], user['created_at'], user['description'], user.get("entities", ""), user.get("location", ""),
user['name'], user['username'], user['verified'], user['public_metrics']['followers_count'], user['public_metrics']['following_count'],user['public_metrics']['tweet_count'], user['public_metrics']['listed_count'],str(user.get("withheld", "")), user.get("protected", ""))
TypeError: string indices must be integers
(venv) PS C:\Dateipfad>


Ich würde mich sehr freuen, wenn mir jemand weiterhelfen kann, bzw. jemand eine Idee hat welchen Ursprungs der Fehler ist.
Liebe Grüße
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was gibt den das print(user) aus? Noch besser, was gibt print(repr(user)) aus?
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Ich wette 100 Gummipunkte:
t['author_id'] ist ein String. Zeile 2 des letzten Codestücks legt nahe, dass user ein Integer sein sollte, aber gem. der Doku kommt die author_id als String an und wird dann an user gebunden. Fälschlicherweise glaubt der TE jedoch, dass es sich bei user um ein Dict oder ähnliches handelt.
print(repr(user)) wird an der entsprechenden Stelle sowas ausgeben wie: '4711'.
fraygeyst
User
Beiträge: 3
Registriert: Mittwoch 22. September 2021, 12:32
Kontaktdaten:

Danke schonmal ihr beiden

print(user)
print(repr(user))

ergibt jeweils
397238289
bzw. '397238289'
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann ist einfachTobi’s Antwort die korrekte - du glaubst du hättest eine Datenstruktur vom Typ Wörterbuch. Es ist aber nur ein String mit einer ID. Wahrscheinlich hat t die gesuchten Werte.
fraygeyst
User
Beiträge: 3
Registriert: Mittwoch 22. September 2021, 12:32
Kontaktdaten:

Hmm okay, leider stehe ich immer noch etwas auf dem Schlauch. Wie soll ich nun im weiteren vorgehen?
Benutzeravatar
sparrow
User
Beiträge: 4184
Registriert: Freitag 17. April 2009, 10:28

Das hat __deets__ doch schon geshrieben. Du bindest die author-ID an den Namen "user" und versuchst hinterher "user" zu verwenden, als wäre es ein Wörterbuch.
Wahrscheinlich stehen die Daten, die du suchst in "t" (was ein wirklich schlechter Name ist, weil niemand weiß, was "t" ist).
User ist schon mal nicht, was du denkst, was es ist. Was es ist, hast du ja schon gezeigt.
Jetzt musst du dir halt anschauen, was "t" ist.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich hätte jetzt spontan auf t wie Tweet getippt.
Antworten