2013-07-02 19 views
6

Próbuję wydrukować wszystkie komentarze z najwyższych wpisów subreddita, aby mój bot mógł je przeanalizować. Miałem go uruchomionego wcześniej tego samego dnia, ale próbowałem go teraz uruchomić i natknąłem się na błąd.W prawdzie, próbuję wydrukować treść komentarza, ale co, jeśli napotkam pusty komentarz?

Oto mój kod:

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. 

zagrała sekcja gdzie ja mam ten problem. Próbuję przejrzeć komentarze, w których napisano "Cricketbot, daj mi australijskie wiadomości". Niestety, jeśli nie ma tu treści komentarza, tzn. Komentarz jest pusty, kod zwraca błąd atrybutu i mówi, że komentarz nie ma atrybutu "body".

Jak obejść ten problem?

Aby wyświetlić cały kod, odwiedź stronę GitHub page for the bot.

Odpowiedz

13

Zwykle pomaga dodać stos, aby ludzie mogli zobaczyć rzeczywisty błąd. Jednak jako opiekun PRAW, wiem, że błąd jest podobny do MoreComments type has no attribute body.

Istnieją trzy proste sposoby radzenia sobie z problemem. Pierwszym z nich jest po prostu opakować instrukcję if "Cricketbot" w try/except i zignorować błąd atrybutu.

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

To jednak nie jest ekscytujące. Drugą metodą jest zapewnienie jesteś rzeczywiście pracuje z obiektem, który ma body atrybut, który można przeprowadzić na dwa sposoby:

Pierwszym jest jednoznacznie sprawdzić, czy atrybut istnieje:

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

The drugi to sprawdź, czy rzeczywiście działa z Comment obiektów zamiast obiektu MoreComments:

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

jednak po uruchomieniu któregokolwiek z powyższych rozwiązań, to w praktyce nie Przetwarzając W komentarzach do zgłoszenia, ponieważ brakuje czegoś, co ukrywa się pod obiektem MoreComments [ref]. Aby wymienić przedmiot MoreComments z niektóre (zastępując wszystko może być bardzo nieefektywne) uwag wymaga użycia funkcji replace_more_comments przed spłaszczenie drzewa:

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

Ustawianie limit=16 i threshold=10 środki zrobić nie więcej niż 16 dodatkowych żądań i wysyłać żądania, które spowodują co najmniej 10 dodatkowych komentarzy. Możesz grać z tymi wartościami, jak chcesz, ale pamiętaj, że każdy zamiennik wymaga dodatkowego żądania (2 sekundy), a niektóre tylko dają zaledwie kilka komentarzy.

Mam nadzieję, że to pomaga.

+0

Dziękuję bardzo! Przepraszam również, to było rzeczywiście "AttributeError:" 'nie ma atrybutu "body". Zapakowałem go w try i tylko to działało, ale drugie nie działa (czytaj: "Nie rozumiem, jak go używać"). Wygląda na to, że sprawdza, czy ciało istnieje, ale po poleceniu przekazu po prostu uruchamia kod. – sunny

+1

Ups, powinno to być kontynuacja, a nie podanie w innych przykładach. Naprawiony. – bboe

+0

To ma teraz sens.Dziękuję raz jeszcze! – sunny