我正在使用imaplib在我的python命令窗口中读取gmail消息。唯一的问题是,如果电子邮件附带换行符和返回车厢。此外,文本似乎没有正确格式化。而不是金额:36.49美元,它返回= 2436.49。我怎样才能清理这个文本?谢谢!
电子邮件内容示例:
r\nItem name: Scanner\r\nItem=23: 130585100869\r\nPurchase Date: Oct 7, 2011\r\nUnit Price: =2436.49 USD\r\nQty: 1\r\nAmount: =2436.49USD\r\nSubtotal: =2436.49 USD\r\nShipping and handling: =240.00 USD\r\nInsurance - not offered
代码:
import imaplib
import libgmail
import re
import email
from BeautifulSoup import BeautifulSoup
USER = 'email@gmail.com'
PASSWORD = 'password'
#connecting to the gmail imap server
imap_server = imaplib.IMAP4_SSL('imap.gmail.com', 993)
imap_server.login(USER, PASSWORD)
imap_server.select('Inbox')
typ, response = imap_server.search(None, '(SUBJECT "payment received")')
Data = []
for i in response[0].split():
results, data = imap_server.fetch(i, "(RFC822)")
Data.append(data)
break
for i in Data:
print i
答案 0 :(得分:6)
数据采用引用可打印的编码方式,这是一个小型数据按摩器,可以满足您的需求:
text = '''\r\nPurchase Date: Oct 7, 2011\r\nUnit Price: =2436.49 USD\r\nQty: 1\r\nAmount: =2436.49 USD\r\nSubtotal: =2436.49 USD\r\nShipping and handling: =240.00 USD\r\nInsurance - not offered : ----\r\n----------------------------------------------------------------------\r\nTax: --\r\nTotal: =2436.49 USD\r\nPayment: =2436.49 USD\r\nPayment sent to: emailaddress=40gmail.com\r\n----------------------------------------------------------------------\r\n\r\nSincerely,\r\nPayPal\r\n=20\r\n----------------------------------------------------------------------\r\nHelp Center:=20\r\nhttps://www.paypal.com/us/cgi-bin/helpweb?cmd=3D_help\r\nSecurity Center:=20\r\nhttps://www.paypal.com/us/security\r\n\r\nThis email was sent by an automated system, so if you reply, nobody will =\r\nsee it. To get in touch with us, log in to your account and click =\r\n=22Contact Us=22 at the bottom of any page.\r\n\r\n'''
raw_data = text.decode("quopri") #replace =XX for the real characters
data = [map(str.strip, l.split(":")) for l in raw_data.splitlines() if ": " in l]
print data
# [['Purchase Date', 'Oct 7, 2011'], ['Unit Price', '$36.49 USD'], ['Qty', '1'], ['Amount', '$36.49 USD'], ['Subtotal', '$36.49 USD'], ['Shipping and handling', '$0.00 USD'], ['Insurance - not offered', '----'], ['Tax', '--'], ['Total', '$36.49 USD'], ['Payment', '$36.49 USD'], ['Payment sent to', 'emailaddress@gmail.com'], ['Help Center', ''], ['Security Center', '']]
在那里,您可以更轻松地处理数据,我希望它有所帮助。
编辑:使其更加可爱:
>>> cooked = dict(data)
>>> print cooked["Unit Price"]
$36.49 USD
答案 1 :(得分:3)
\r\n
问题 \r\n
问题是由于您没有打印字符串而是内部表示造成的。试试这个来理解我的意思:
print ['test\n']
print 'test\n'
您在上面打印的i
是一个字符串列表,因此第一个代表就会出现。请尝试:
print(Data[0][0][1])
我通过检查对象来识别这一点 - 您应该阅读您正在使用的库的文档,以了解该对象的确切内容,以理解为什么特定的这个字段代表消息。或者如何将Data
对象转换为更合适的东西......
尝试:
import quopri
print quopri.decodestring(Data[0][0][1])
答案 2 :(得分:1)
如果这些实际上是电子邮件,您可以使用email
module来帮助您入门。您可以使用它来进行正确的可引用打印解码并获得一些干净的文本。
之后,您需要编写自己的代码来提取所需的部分。这不是解析器存在的标准格式。我会使用正则表达式。
请注意,\r\n
很可能只是回车符后跟一个换行符,而不是“斜杠,r,斜杠,n”。在交互式终端中,Python将用符号形式表示控件和空白字符。
答案 3 :(得分:0)
只需使用拆分,然后检查该行是否符合您要查找的内容。
你可以稍微提高一点,但这是处理它的一种相当简单的方法。
f = yourBlockOfText
text = f.split('\\r\\n')
for line in text:
if line[0:4] == "Unit":
print line
elif line[0:17] == "Payment sent to: ":
print line