IndexError: Индекс списка вне диапазона при захвате текста Gmail

Я использую этот код для входа в свою учетную запись gmail и получения текста из электронного письма от steampowered.

else:
      g = gmail.login(emailAddress, emailPassword)
      # Check for emails until we get Steam Guard code
      for i in range(0, 3):
        mails = g.inbox().mail(sender="[email protected]", unread=True)
        if mails:
          mail = mails[-1]
          mail.fetch()
          #print re.findall(r"you'll need to complete the process: ([A-Z0-9]{5})", mail.body)
          guardCode = re.findall(r"you'll need to complete the process: ([A-Z0-9]{5})", mail.body)[0]
          mail.read()
          mail.delete()
          g.logout()
          return guardCode
        else:
          time.sleep(3)

я получаю

IndexError: индекс списка вне диапазона

В этой строке:

guardCode = re.findall(r"you'll need to complete the process: ([A-Z0-9]{5})", mail.body)[0]

Это потому что

re.findall(r"you'll need to complete the process: ([A-Z0-9]{5})", mail.body)

Возвращает

[]

Итак, список пуст. Почему он пустой?

Это формат письма:

Вы входите в Steam с помощью нового браузера или приложения Steam? Вот код Steam Guard, который вам понадобится для завершения процесса: XXXXX ‹---- Мне нужно это

EDIT: Gmail – это настраиваемый модуль Python, который можно найти здесь. РЕДАКТИРОВАНИЕ № 2. Вот лучшее представление электронной почты:

Уважаемый ХХХ,

Вы входите в Steam с помощью нового браузера или приложения Steam? Вот код Steam Guard, который вам понадобится для завершения процесса:

ХХХХХ

Если вы в последнее время не пытались войти в Steam с устройства, расположенного по адресу XXXX (США), возможно, кто-то еще пытается получить доступ к вашей учетной записи. Вы можете просмотреть дополнительную информацию об этой попытке входа в систему в Интернете.

Если вы подозреваете, что кто-то пытается получить доступ к вашей учетной записи, пожалуйста, выполните одно из следующих действий:


person Vishwa Iyer    schedule 26.11.2014    source источник


Ответы (2)


Проблема из-за в you’ll. Это не обычная одинарная кавычка '.

>>> s = "Are you logging into Steam using a new browser or Steam app? Here’s the Steam Guard code you’ll need to complete the process: XXXXX"
>>> re.findall(r"you’ll need to complete the process: ([A-Z0-9]{5})", s)
['XXXXX']
person Avinash Raj    schedule 26.11.2014
comment
Ух ты. Как ты это догадался? - person doctorlove; 26.11.2014
comment
Как совместить это с mail.body? - person Vishwa Iyer; 26.11.2014
comment
замените s в приведенном выше коде на mail.body (т. е. переменную, в которой хранится ввод, с которым вы хотите работать). - person Avinash Raj; 26.11.2014
comment
Нет, я имею в виду, что я беру значение XXXXX из электронного письма, поэтому я не могу установить для mail.body строку, это должно быть тело электронного письма. - person Vishwa Iyer; 26.11.2014
comment
извините, я не знаю, что вы имеете в виду. Я только что ответил только на So the list is empty. Why is it empty? вопрос. Подождите, кто-нибудь обязательно решит вашу проблему. - person Avinash Raj; 26.11.2014
comment
Мне жаль. Я был виноват здесь. Я изменил код на этот guardCode = re.findall(r"you’ll need to complete the process: ([A-Z0-9]{5})", mail.body)[0], но теперь получаю SyntaxError: не-ASCII-символ '\xe2', кодировка не объявлена, см. python.org/dev/peps/pep-0263, чтобы узнать больше. - person Vishwa Iyer; 26.11.2014
comment
поместите # -*- coding: utf-8 -*- вверху в файле сценария Python. См. stackoverflow.com/a/10589674/3297613. - person Avinash Raj; 26.11.2014
comment
Лол, теперь опять та же ошибка. (IndexError: индекс списка вне диапазона) - person Vishwa Iyer; 26.11.2014
comment
Может ли новая линия быть проблемой? - person Vishwa Iyer; 26.11.2014
comment
не могли бы вы предоставить содержимое входной строковой переменной? - person Avinash Raj; 26.11.2014

Я решил свою проблему. Я только что удалил все разрывы строк и сделал основной текст электронной почты одной целой строкой. Спасибо всем, кто помог!

str = re.sub('\s+',' ', mail.body)
guardCode = re.findall(r'to complete the process: ([A-Z0-9]{5})', str)[0]
person Vishwa Iyer    schedule 26.11.2014