我正在开发一个项目,通过imap从gmail中下载聊天记录。我已成功登录,并通过以下代码显示最新的gchat脚本:
import getpass, imaplib, email, re, sys
s=imaplib.IMAP4_SSL('imap.gmail.com', 993)
getuser = raw_input("<username>")
getpass = raw_input("<password>")
s.login(getuser, getpass)
s.select('[Gmail]/Chats',readonly=True)
result, data = s.uid('search', None, "ALL")#fetch email body (RFC822) for the given ID
latest_email_uid = data[0].split()[-1]
result, data = s.uid('fetch', latest_email_uid, '(RFC822)')
raw_email = data[0][1]
print raw_email
s.close()
s.logout()
输出涉及我想要摆脱的大量gobbledygook。例如,这是一行聊天:
<con:conversation xmlns:con="google:archive:conversation"><cli:message
to="<email redacted>" from="<email redacted>"
int:cid="13865109981248781158" int:sequence-no="4"
int:time-stamp="1323547231442" xmlns:cli="jabber:client"
xmlns:int="google:internal"><cli:body>uhh</cli:body>
理想情况下,我想保留“to =”字段,以及cli:body / cli:body标签之间的所有内容。我一直在阅读堆栈的例子,以及正则表达式,但我是一个新手,我感到困惑。有人可以帮忙吗?
答案 0 :(得分:0)
看看XML解析库。 python的快速库是lxml:
lxml XML工具包是C库libxml2和libxslt的Pythonic绑定。它的独特之处在于它将这些库的速度和XML特性完整性与原生Python API的简单性相结合,大多数兼容但优于众所周知的ElementTree API。
然后通过XPath表达式提取to
元素和cli:body
元素的文本。
注意:如果您以前从未使用过XML或XML库,请给自己一些时间来学习。 XML并不是最容易掌握的东西,但我认为应用正确的问题模型会使你的代码更加清晰。
答案 1 :(得分:0)
您希望为此使用XML解析器。 Python有许多XML解析器可供选择(在Python标准库的内部和外部)。标准库中的XML包的文档可在Structured Markup Processing Tools。
中找到以下是使用xml.etree.ElementTree的示例。在其中我对您的XML做了一些假设(因为您没有提供完整的树)。该示例仅包含一个message
元素及其子元素,但这应该可以帮助您了解如何处理整个conversation
树。
from xml.etree.ElementTree import ElementTree
import StringIO
# This is all set up to have data for the example.
msg = """<cli:message to="to@nowhere.com" from="from@nowhere.com"
int:cid="13865109981248781158" int:sequence-no="4" int:time-stamp="1323547231442"
xmlns:cli="jabber:client" xmlns:int="google:internal">
<cli:body>uhh</cli:body>
</cli:message>"""
msgf = StringIO.StringIO(msg)
# Now we parse the tree given a file-like object.
tree = ElementTree()
tree.parse(msgf)
to = tree.getroot().attrib['to']
body = tree.find('{jabber:client}body').text
现在我们有:
>>> to
'to@nowhere.com'
>>> body
'uhh'