2017-01-25 19 views
0

Я пытаюсь прокрутить subreddits, но хочу игнорировать липкие сообщения в верхней части. Я могу печатать первые 5 сообщений, к сожалению, включая липкие. Различные методы pythonic, пытающиеся пропустить их, потерпели неудачу. Два разных примера моего кода ниже.Python Praw пропущен липкий в subreddits

  subreddit = reddit.subreddit(sub) 
      for submission in subreddit.hot(limit=5): 

       # If we haven't replied to this post before 
       if submission.id not in posts_replied_to: 
        ##FOOD 

        if subreddit == 'food': 

         if 'pLEASE SEE' in submission.title: 
          pass 
         if "please vote" in submission.title: 
          pass 
         else: 
          print(submission.title) 
         if re.search("please vote", submission.title, re.IGNORECASE): 
          pass 
         else: 

          print(submission.title) 

Я заметил липкую метку в документах, но не знаю точно, как ее использовать. Любая помощь приветствуется.

+0

Сделайте строчки в нижнем регистре и проверьте на 'submission.title.lower()' –

+0

Не могли бы вы распечатать названия, которые вы сравниваете, и отметить, какие из них являются липкой? Это поможет с отладкой регулярных выражений. В противном случае используйте ответ @ al-avery. –

+0

Прежде чем продолжить, я настоятельно рекомендую прочитать основной учебник по Python. –

ответ

2

It looks like you can get the id of a stickied post based on docs. Так что, возможно, вы могли бы получить id (ы) липких сообщений (обратите внимание, что с параметром «число» липкого метода, который вы можете сказать, дайте мне первый, второй или третий, липкий пост, используйте это для ваше преимущество, чтобы получить все из липких сообщений), и для каждого представления, которое вы собираетесь вытащить, сначала проверьте его идентификатор на липкие идентификаторы.

Пример:

# assuming there are no more than three stickies... 
stickies = [reddit.subreddit("chicago").sticky(i).id for i in range(1,4)] 

, а затем, когда вы хотите, чтобы убедиться, что данное сообщение не stickied, использование:

if post.id not in stickies: 
    do something 

Похоже, там были меньше, чем три, это будет дайте вам список с дублирующимися идентификаторами, что не будет проблемой.

+0

Некоторый пример кода был бы приятным. –

+0

Хорошо, отредактировано каким-то кодом :) –

+0

На самом деле, он будет увеличивать 'prawcore.NotFound', если меньше, чем 3 вместо возврата повторяющихся идентификаторов в соответствии с документами. –

1

В качестве дополнения к @Al ответ Эвери, вы можете сделать полный поиск идентификаторов всех липучки на данном subreddit, делая что-то вроде

def get_all_stickies(sub): 
    stickies = set() 
    for i in itertools.count(1): 
     try: 
      sid = sub.sticky(i) 
     except pawcore.NotFound: 
      break 
     if sid in stickies: 
      break 
     stickies.add(sid) 
    return stickies 

Эта функция принимает во внимание, что документация привести один ожидать ошибку, если недопустимый индекс указан в stick, в то время как фактическое поведение похоже на то, что возвращается дублирующийся идентификатор. Использование set вместо списка делает поиск быстрее, если у вас есть большое количество стикеров. Вы должны использовать функцию

subreddit = reddit.subreddit(sub) 
stickies = get_all_stickies(subreddit) 
for submission in subreddit.hot(limit=5): 
    if submission.id not in posts_replied_to and submission.id not in stickies: 
     print(submission.title) 
+0

Ive пробовал это несколько раз, но я получаю сообщение об ошибке Traceback (последний последний звонок): Файл «/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/praw/models/ reddit/base.py ", строка 34, в __getattr__ .format (self .__ class __.__ name__, attribute)) AttributeError: объект Subreddit не имеет атрибута 'stick' – Anekdotin

+0

@Eddwinn. Этого следует ожидать. Я случайно ошибся «липким» как «палка». Исправлено. –

+0

К сожалению, он считает каждый пост липким. липучки = get_all_stickies (reddit.subreddit (ул (subreddit))) если липучки: печати (липучки) печати (submission.title) еще: печати ("не липкий:" + submission.title) – Anekdotin

2

Материалы, которые stickied имеют атрибут sticked, которое вычисляет True. Добавьте в свой цикл следующее, и вам должно быть хорошо идти.

if submission.stickied: 
    continue 

В общем, я рекомендую проверить доступные атрибуты объектов вы работаете с, чтобы увидеть, если есть что-то годны к употреблению. См.: Determine Available Attributes of an Object

+0

Я вижу с печатными варами подчинения. Я изначально задавался вопросом, почему это не было упомянуто, но спасибо за указание, как найти информацию. – Anekdotin