在lis中查找内容的问题

2024-09-22 14:34:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序,可以从我的电子邮件中检索信息(通过POP),我想检索电子邮件的主题,我使用这个:

import poplib
from email import parser
pop_srvr = poplib.POP3_SSL('pop.gmail.com')
pop_srvr.user('username')
pop_srvr.pass_('password')
messages = [pop_srvr.retr(i) for i in range(1, len(pop_srvr.list()[1]) + 1)]
messages = [b"\n".join(mssg[1]) for mssg in messages]
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
for message in messages:
  print (message['subject'])
  print (message['body'])
pop_srvr.quit()

但当我运行它时,我得到了这个

Traceback (most recent call last):
File "C:/Users/Yousef/Desktop/parser proto.py", line 11, in <module>
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
File "C:/Users/Yousef/Desktop/parser proto.py", line 11, in <listcomp>
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
File "C:\Users\Yousef\AppData\Local\Programs\Python\Python36-
32\lib\email\parser.py", line 68, in parsestr
return self.parse(StringIO(text), headersonly=headersonly)
TypeError: initial_value must be str or None, not bytes

有人告诉我我做错了什么。。。你知道吗


Tags: inpyparsermessageforlinepopusers
2条回答
It seems linke  poplib.POP3_SSL module returns bytes object.

You probably need to change following :


    ["\n".join(mssg[1]) for mssg in messages]

 to

    [b"\n".join(mssg[1]) for mssg in messages]

我发现email模块有message_from_bytes函数。你试过用它吗?我可能被误解在下面的代码。请在您身边核实:

import email

messages = [pop_srvr.retr(i) for i in range(1, len(pop_srvr.list()[1]) + 1)]
messages = [b"\n".join(mssg[1]) for mssg in messages]
messages = [email.message_from_bytes(mssg) for mssg in messages]
for message in messages:
  print (message['subject'])
  print (message['body'])
pop_srvr.quit()

更多信息:parsing email contents from poplib with email module (PYTHON)

你试过把它串起来吗?你知道吗

messages = [parser.Parser().parsestr(str(mssg)) for mssg in messages]

它可能会导致一个不正确的字符串,但通过这种方式,您可以检查mssg是否真的是一个类似于的字节。如果错误消失了,你可以用一种适合你的程序的方式来转换它。你知道吗

相关问题 更多 >