2013-07-02 6 views
6

Tôi đang cố gắng in tất cả các bình luận từ các bài viết trên cùng của một subreddit để bot của tôi có thể phân tích chúng. Tôi đã có nó chạy trước đó trong ngày, nhưng tôi đã cố gắng chạy nó ngay bây giờ và tôi đã đi qua một lỗi.Trong hình vẽ, tôi đang cố gắng in nội dung nhận xét, nhưng nếu tôi gặp phải nhận xét trống thì sao?

Đây là mã của tôi:

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. 

Phần đóng vai chính là nơi tôi đang gặp vấn đề này. Tôi đang cố gắng xem qua các bình luận có "Cricketbot, cho tôi tin tức Úc" được viết trong đó. Rất tiếc, nếu nội dung của nhận xét không có ở đó, nghĩa là nhận xét trống, mã trả về lỗi Thuộc tính và nói rằng nhận xét không có thuộc tính 'body'.

Làm cách nào để khắc phục sự cố này?

Để xem toàn bộ mã, vui lòng truy cập GitHub page for the bot.

Trả lời

13

Nó thường giúp thêm stacktrace để mọi người có thể nhìn thấy lỗi thực tế. Tuy nhiên, như người bảo trì PRAW, tôi biết lỗi là một cái gì đó như MoreComments type has no attribute body.

Có ba cách đơn giản để xử lý sự cố của bạn. Đầu tiên là chỉ cần bọc câu lệnh if "Cricketbot" trong một lần thử/trừ và bỏ qua lỗi thuộc tính.

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

Đó không phải là khủng khiếp thú vị mặc dù. Phương pháp thứ hai là để đảm bảo bạn đang thực sự làm việc với một đối tượng mà có một thuộc tính body mà có thể được thực hiện theo hai cách:

Đầu tiên là để kiểm tra một cách rõ ràng nếu các thuộc tính tồn tại:

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

Các thứ hai là để xác minh bạn đang thực sự làm việc với Comment đối tượng chứ không phải là MoreComments đối tượng:

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

Tuy nhiên, khi chạy bất kỳ trong những giải pháp trên, bạn đang có hiệu quả không xử lý một sẽ nhận xét về nội dung gửi vì bạn thiếu bất kỳ nội dung nào bị ẩn sau đối tượng MoreComments [ref]. Để thay thế các đối tượng MoreComments với một số (thay thế tất cả có thể rất hiệu quả) của các ý kiến ​​đòi hỏi sử dụng các replace_more_comments chức năng trước khi làm phẳng cây:

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

Thiết limit=16threshold=10 phương tiện thực hiện không quá 16 yêu cầu bổ sung và chỉ đưa ra các yêu cầu sẽ dẫn đến ít nhất 10 nhận xét bổ sung. Bạn có thể chơi với những giá trị như bạn muốn, nhưng lưu ý rằng mỗi thay thế đòi hỏi một yêu cầu bổ sung (2 giây) và một số chỉ mang lại một vài chú thích.

Tôi hy vọng rằng sẽ giúp.

+0

Cảm ơn bạn rất nhiều! Cũng xin lỗi, nó thực sự là 'AttributeError: '' không có thuộc tính 'body''. Tôi bọc nó trong cố gắng và ngoại trừ và làm việc, nhưng một trong những khác không hoạt động (đọc, 'Tôi không hiểu làm thế nào để sử dụng nó'). Dường như nó kiểm tra xem cơ thể có tồn tại hay không, nhưng sau lệnh sau, nó vẫn chạy mã. – sunny

+1

Rất tiếc, nó phải là tiếp tục, không phải là thông qua trong các ví dụ khác. Đã sửa. – bboe

+0

Điều đó có ý nghĩa ngay bây giờ.Cảm ơn bạn một lần nữa! – sunny