2014-04-16 31 views
5

Sto avendo un problema seguente:estrazione hashtags su Twitter trend dei dati argomenti con Python Tweepy

utilizzando l'API di Twitter e il modulo tweepy, voglio di monitorare i trend argomenti ed estrarre hashtags fuori dei dati.

Questo codice:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import tweepy, json 

CONSUMER_KEY = 'key' 
CONSUMER_SECRET = 'secret' 
ACCESS_KEY = 'key' 
ACCESS_SECRET = 'secret' 
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET) 
api = tweepy.API(auth) 

trends1 = api.trends_place(1) 
print trends1 

mi dà i dati relativi trend a livello globale argomenti che è strutturato in questo modo:

[{u'created_at': u'2014-04-16T12:13:15Z', u'trends': [{u'url': u'http://twitter.com/search?q=%22South+Korea%22', u'query': u'%22South+Korea%22', u'name': u'South Korea', u'promoted_content': None}, {u'url': u'http://twitter.com/search?q=%23FETUSONEDIRECTIONDAY', u'query': u'%23FETUSONEDIRECTIONDAY', u'name': u'#FETUSONEDIRECTIONDAY', u'promoted_content': None}, {u'url': u'http://twitter.com/search?q=%23PrayForSouthKorea', u'query': u'%23PrayForSouthKorea', u'name': u'#PrayForSouthKorea', u'promoted_content': None}, {u'url': u'http://twitter.com/search?q=%23GaraGaraRP', u'query': u'%23GaraGaraRP', u'name': u'#GaraGaraRP', u'promoted_content': None}, {u'url': u'http://twitter.com/search?q=%23%D8%A5%D8%B3%D9%85_%D8%A3%D9%85%D9%8A_%D8%A8%D8%AC%D9%88%D8%A7%D9%84%D9%8A', u'query': u'%23%D8%A5%D8%B3%D9%85_%D8%A3%D9%85%D9%8A_%D8%A8%D8%AC%D9%88%D8%A7%D9%84%D9%8A', u'name': u'#\u0625\u0633\u0645_\u0623\u0645\u064a_\u0628\u062c\u0648\u0627\u0644\u064a', u'promoted_content': None}, {u'url': u'http://twitter.com/search?q=%23Kad%C4%B1nlarKamyon%C5%9Eof%C3%B6r%C3%BCOlursa', u'query': u'%23Kad%C4%B1nlarKamyon%C5%9Eof%C3%B6r%C3%BCOlursa', u'name': u'#Kad\u0131nlarKamyon\u015eof\xf6r\xfcOlursa', u'promoted_content': None}, {u'url': u'http://twitter.com/search?q=%22Dear+My+BestFriend%22', u'query': u'%22Dear+My+BestFriend%22', u'name': u'Dear My BestFriend', u'promoted_content': None}, {u'url': u'http://twitter.com/search?q=%22%D0%A1%D0%B0%D0%BC%D0%BE%D0%BE%D0%B1%D0%BE%D1%80%D0%BE%D0%BD%D0%B0+100%22', u'query': u'%22%D0%A1%D0%B0%D0%BC%D0%BE%D0%BE%D0%B1%D0%BE%D1%80%D0%BE%D0%BD%D0%B0+100%22', u'name': u'\u0421\u0430\u043c\u043e\u043e\u0431\u043e\u0440\u043e\u043d\u0430 100', u'promoted_content': None}, {u'url': u'http://twitter.com/search?q=%22If+I+Stay%22', u'query': u'%22If+I+Stay%22', u'name': u'If I Stay', u'promoted_content': None}, {u'url': u'http://twitter.com/search?q=Gabashvili', u'query': u'Gabashvili', u'name': u'Gabashvili', u'promoted_content': None}], u'as_of': u'2014-04-16T12:20:29Z', u'locations': [{u'woeid': 1, u'name': u'Worldwide'}]}] 

Si tratta di una lista di pitone, contenente vari dizionari? Come posso estrarre gli hashtag da quei dati e salvarli in nuove variabili?

Sono nuovo di Python quindi per favore spiega le tue scelte.

Grazie!

+0

avete abbastanza rep upvote ora;) – EdChum

+0

lo ha fatto, grazie! :) –

risposta

2

Nell'esempio si ha una sola voce nel proprio elenco, costituita da dict annidati con valore chiave 'trends' ogni valore è un altro dict, quello a cui si è interessati è 'nome' e in particolare se inizia con '#':

In [180]: 

[x for x in temp[0]['trends'] if x['name'].find('#') ==0] 
Out[180]: 
[{'name': '#FETUSONEDIRECTIONDAY', 
    'promoted_content': None, 
    'query': '%23FETUSONEDIRECTIONDAY', 
    'url': 'http://twitter.com/search?q=%23FETUSONEDIRECTIONDAY'}, 
{'name': '#PrayForSouthKorea', 
    'promoted_content': None, 
    'query': '%23PrayForSouthKorea', 
    'url': 'http://twitter.com/search?q=%23PrayForSouthKorea'}, 
{'name': '#GaraGaraRP', 
    'promoted_content': None, 
    'query': '%23GaraGaraRP', 
    'url': 'http://twitter.com/search?q=%23GaraGaraRP'}, 
{'name': '#إسم_أمي_بجوالي', 
    'promoted_content': None, 
    'query': '%23%D8%A5%D8%B3%D9%85_%D8%A3%D9%85%D9%8A_%D8%A8%D8%AC%D9%88%D8%A7%D9%84%D9%8A', 
    'url': 'http://twitter.com/search?q=%23%D8%A5%D8%B3%D9%85_%D8%A3%D9%85%D9%8A_%D8%A8%D8%AC%D9%88%D8%A7%D9%84%D9%8A'}, 
{'name': '#KadınlarKamyonŞoförüOlursa', 
    'promoted_content': None, 
    'query': '%23Kad%C4%B1nlarKamyon%C5%9Eof%C3%B6r%C3%BCOlursa', 
    'url': 'http://twitter.com/search?q=%23Kad%C4%B1nlarKamyon%C5%9Eof%C3%B6r%C3%BCOlursa'}] 

EDIT per ottenere solo i hastags:

In [181]: 

[x['name'] for x in temp[0]['trends'] if x['name'].find('#') ==0] 
Out[181]: 
['#FETUSONEDIRECTIONDAY', 
'#PrayForSouthKorea', 
'#GaraGaraRP', 
'#إسم_أمي_بجوالي', 
'#KadınlarKamyonŞoförüOlursa'] 

È possibile utilizzare startswith invece di find:

[x['name'] for x in temp[0]['trends'] if x['name'].startswith('#')] 
+0

Grazie! Era davvero perso con la struttura di questi dati ... Puoi raccomandare un metodo per estrarre il "nome" da esso? Anche alcuni nomi non contengono #, ma sono interessato solo a quelli che lo fanno. –

+0

La mia risposta estrae solo i nomi che hanno un '#' all'inizio – EdChum

+0

Sì, funziona come hai scritto tu, ma ti dà anche molte altre cose (come 'promoted_content', 'query' etc). Vorrei solo bisogno l'uscita di essere qualcosa di simile: #FETUSONEDIRECTIONDAY #PrayForSouthKorea ecc –

3

I dati sono un elenco contenente un dizionario. Una delle chiavi in ​​questo dizionario è chiamata trend. Il valore per questa chiave è un elenco di dizionari. Ognuno di questi dizionari contiene una chiave chiamata name, che contiene una stringa contenente un hashtag. Ecco un esempio di accesso ai dati:

hashtags = [] 
trends = data[0]['trends'] 
for trend in trends: 
    name = trend['name'] 
    if name.startswith('#'): 
     hashtags.append(name) 

Questo può essere compresso per:

hashtags = [trend['name'] for trend in data[0]['trends'] if trend['name'].startswith('#')] 

Le prime tre linee di uscita:

>>> for hashtag in hashtags: 
     print(hashtag) 
#FETUSONEDIRECTIONDAY 
#PrayForSouthKorea 
#GaraGaraRP 
+0

Entrambi sembrano davvero belli perché filtrano il 'nome' ed estrae solo hashtag !, ma continuo a ricevere 'KeyError: 0', qualsiasi idea di cosa sto facendo male? –

+0

@loop_digga significa che i tuoi dati sono in realtà un dizionario e non un elenco come hai mostrato. Prova di nuovo la mia risposta. –

+0

È strano, ho appena copiato l'output dei dati dal notebook ipython.Ora l'errore è: 'TypeError: tipo non disattivabile:' list ''. –