通过使用Python从imap中删除的gchats中删除无关的字符

时间:2011-12-10 20:43:36

标签: python regex gmail imap

我正在开发一个项目,通过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标签之间的所有内容。我一直在阅读堆栈的例子,以及正则表达式,但我是一个新手,我感到困惑。有人可以帮忙吗?

2 个答案:

答案 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'