2013-07-02 5 views
6

Sto provando a stampare tutti i commenti dai primi post di un subreddit in modo che il mio bot possa analizzarli. L'ho fatto funzionare in precedenza, ma ho provato a eseguirlo ora e ho riscontrato un errore.In praw, sto provando a stampare il corpo del commento, ma cosa succede se incontro un commento vuoto?

Ecco il mio codice:

r = praw.Reddit('Comment crawler v1.0 by /u/...') 
r.login('username', 'password') 
subreddit=r.get_subreddit('subreddit') 
post_limit = 25 
subreddit_posts = subreddit.get_hot(limit=post_limit) 
subids = set() 
for submission in subreddit_posts: 
    subids.add(submission.id) 
subid = list(subids) 

i=0 
while i < post_limit: 
    submission = r.get_submission(submission_id=subid[i]) 
    flat_comments = praw.helpers.flatten_tree(submission.comments) 
    with open('alreadydone.txt', 'r') as f: 
     already_done = [line.strip() for line in f] 
    f.close() 
    for comment in flat_comments: 
     if "Cricketbot, give me Australian news" in **comment.body** and comment.id not in already_done: 
      info = feedparser.parse(Australia) #Australia gives a link to an RSS feed. 

sezione Speciali è dove sto avendo il problema. Sto cercando di guardare attraverso i commenti che hanno scritto "Cricketbot, dammi notizie australiane". Sfortunatamente, se il corpo del commento non è presente, cioè il commento è vuoto, il codice restituisce un errore di attributo e dice che il commento non ha attributo 'corpo'.

Come si aggira questo problema?

Per visualizzare l'intero codice, visitare il numero GitHub page for the bot.

risposta

13

Solitamente è utile aggiungere lo stacktrace in modo che le persone possano vedere l'errore effettivo. Tuttavia, come manutentore PRAW, so che l'errore è qualcosa come MoreComments type has no attribute body.

Ci sono tre semplici modi per gestire il tuo problema. Il primo consiste nel racchiudere semplicemente l'istruzione if "Cricketbot" in un tentativo/eccetto e ignorare l'errore di attributo.

try: 
    if "Cricketbot..." 
     ... 
except AttributeError: 
    pass 

Questo non è molto eccitante però. Il secondo metodo è quello di garantire che si sta effettivamente lavorando con un oggetto che ha un attributo body che può essere fatto in due modi:

Il primo è quello di verificare in modo esplicito se l'attributo esiste:

for comment in flat_comments: 
    if not hasattr(comment, 'body'): 
     continue 
    ... 

Il secondo è verificare realtà si sta lavorando con Comment oggetti piuttosto che l'oggetto MoreComments:

for comment in flat_comments: 
    if not isinstance(comment, praw.objects.Comment): 
     continue 
    ... 

Tuttavia, quando si esegue una delle soluzioni di cui sopra, si sta effettivamente non elaborando un Tutti i commenti su un invio in quanto ti manca qualcosa nascosto dietro un oggetto MoreComments [ref]. Per sostituire l'oggetto MoreComments con alcuni (sostituzione di tutti può essere molto inefficiente) delle osservazioni richiede l'utilizzo della funzione replace_more_comments prima di appiattimento della struttura:

submission = r.get_submission(submission_id=subid[i]) 
submission.replace_more_comments(limit=16, threshold=10) 
flat_comments = praw.helpers.flatten_tree(submission.comments) 

Impostazione limit=16 e threshold=10 mezzi rendono non più di 16 ulteriori richieste e solo effettuare richieste che comporteranno almeno 10 commenti aggiuntivi. Puoi giocare con quei valori come desideri, ma ricorda che ogni sostituzione richiede una richiesta aggiuntiva (2 secondi) e alcuni producono solo un solo commento.

Spero che questo aiuti.

+0

Grazie mille! Scuse pure, era davvero "AttributeError:" "non ha attributo 'body'. L'ho avvolto nel tentativo, tranne che ha funzionato, ma l'altro non funziona (leggi "Non capisco come usarlo"). Sembra che controlli se il corpo esiste, ma dopo il comando pass, esegue comunque il codice. – sunny

+1

Oops, dovrebbe essere un continuo, non un passaggio negli altri esempi. Fisso. – bboe

+0

Questo ha senso ora.Grazie ancora! – sunny