Как ограничить комментарии первого уровня в Praw Reddit?

Можно ли ограничить комментарии первого уровня, которые возвращает replace_more функция?

submission.comments.replace_more(limit=1)

Или убрать все MoreComments объекты с первого уровня? Я имею в виду, что я хотел бы ограничить дерево комментариев height и получить максимум width (получить все комментарии, которые идут из ограниченного количества комментариев первого уровня).


person F. Vosnim    schedule 10.03.2020    source источник
comment
Вы можете уточнить, что означают комментарии первого уровня? Вы хотите получать только комментарии, которые являются прямыми ответами на сообщение (то есть, пропуская все комментарии, которые являются ответами на другие комментарии)?   -  person jarhill0    schedule 10.03.2020
comment
Первый уровень в Reddit api имеет свой параметр: depth=0. Это первый уровень каждой ветви дерева комментариев.   -  person F. Vosnim    schedule 10.03.2020
comment
Самые оставленные комментарии на странице Reddit   -  person F. Vosnim    schedule 10.03.2020


Ответы (1)


Вместо того, чтобы использовать replace_more, просто заменяйте каждый объект MoreComments по мере того, как вы к нему дойдете. Это предотвратит замену любых MoreComments объектов, не находящихся на верхнем уровне.

Ниже приведена функция, которая будет перебирать комментарии верхнего уровня, заменяя каждый MoreComments по мере его появления. Это навеяно примером кода из документации PRAW.:

from praw.models import MoreComments

def iter_top_level(comments):
    for top_level_comment in comments:
        if isinstance(top_level_comment, MoreComments):
            yield from iter_top_level(top_level_comment.comments())
        else:
            yield top_level_comment

Этот генератор работает так: он выдает комментарии верхнего уровня из представления, но когда он встречает объект MoreComments, он загружает эти комментарии и рекурсивно вызывает себя. Рекурсивный вызов необходим, потому что в больших потоках каждый объект MoreComments содержит в конце другой объект MoreComments верхнего уровня.

Вот пример того, как вы могли бы это использовать:

submission = reddit.submission('fgi5bd')
for comment in iter_top_level(submission.comments): 
    print(comment.author) 
person jarhill0    schedule 11.03.2020