2013-07-02 9 views
6

Ich versuche, alle Kommentare von den Top-Posts eines Subreddit zu drucken, so dass mein Bot sie analysieren kann. Ich hatte es früher am Tag laufen, aber ich habe es jetzt versucht und ich bin auf einen Fehler gestoßen.In praw versuche ich den Kommentarkörper zu drucken, aber was ist, wenn ich auf einen leeren Kommentar stoße?

Hier ist mein Code:

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. 

Der spielte Abschnitt ist, wo ich das Problem habe. Ich versuche, Kommentare durchzusehen, in denen "Cricketbot, gib mir australische Nachrichten" geschrieben ist. Wenn der Text des Kommentars nicht vorhanden ist, d. H. Der Kommentar leer ist, gibt der Code leider einen Attributfehler zurück und sagt, dass der Kommentar kein Attribut "body" hat.

Wie kommt man um dieses Problem herum?

Um den gesamten Code zu sehen, besuchen Sie bitte die GitHub page for the bot.

Antwort

13

Es hilft normalerweise, den Stacktrace hinzuzufügen, damit Leute den tatsächlichen Fehler sehen können. Als PRAW-Betreuer weiß ich jedoch, dass der Fehler etwa MoreComments type has no attribute body ist.

Es gibt drei einfache Möglichkeiten, Ihr Problem zu lösen. Die erste besteht darin, einfach die if "Cricketbot"-Anweisung in einen try/except-Code zu schreiben und den Attributfehler zu ignorieren.

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

Das ist aber nicht sehr aufregend. Die zweite Methode ist, dass Sie, um sicherzustellen, sind tatsächlich mit einem Objekt arbeiten, die ein body Attribut hat, das in zwei Arten erfolgen kann:

Die erste ist explizit zu prüfen, ob das Attribut vorhanden:

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

Die an zweiter Stelle zu prüfen ist, dass Sie tatsächlich mit Comment Objekten arbeiten anstatt die MoreComments Objekt:

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

wenn jedoch eine der oben genannten Lösungen ausgeführt wird, werden Sie nicht effektiv verarbeiten ein lle die Kommentare zu einer Einsendung, da Sie alles vermissen, was sich hinter einem MoreComments Objekt versteckt [ref]. So ersetzen Sie die MoreComments Objekt mit einige (alle ersetzen kann sehr ineffizient sein) der Kommentare erfordert Verwendung der replace_more_comments Funktion vor den Baum Abflachung:

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

Einstellung limit=16 und threshold=10 Mittel machen nicht mehr als 16 zusätzliche Anforderungen und nur Anfragen stellen, die zu mindestens 10 zusätzlichen Kommentaren führen. Sie können mit diesen Werten spielen, wie Sie möchten, aber beachten Sie, dass jede Ersetzung eine zusätzliche Anfrage erfordert (2 Sekunden) und einige nur so wenig wie ein Kommentar ergeben.

Ich hoffe, dass hilft.

+0

Vielen Dank! Entschuldigungen, es war in der Tat "AttributeError: '' hat kein Attribut 'body''. Ich habe es in Versuch und Ausnahme eingewickelt und das hat funktioniert, aber der andere funktioniert nicht (lesen Sie: "Ich verstehe nicht, wie man es benutzt"). Es scheint, dass es überprüft, um zu sehen, ob der Körper existiert, aber dann nach dem Befehl pass, nur den Code läuft sowieso. – sunny

+1

Ups, es sollte ein Fortfahren sein, kein Pass in den anderen Beispielen. Fest. – bboe

+0

Das macht jetzt Sinn.Vielen Dank noch mal! – sunny