2011-12-10 1 views
0

私はIMAP経由でgmailからチャット記録をプルダウンするプロジェクトに取り組んでいます。私は正常にログインし、次のコードを経由して、最新のgchat転写物を表示していますimap経由でPythonにプルされたgchatsから無関係な文字を取り除く

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() 

出力は私がを取り除きたい珍糞漢糞の全体の多くを必要とします。たとえば、これはチャットの一行です:ボディ/ CLI:bodyタグ

<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> 

理想的には私は「に=」フィールドと同様に、CLIの間のすべてを維持したいと思います。私は正規表現だけでなく、これの例をスタックで読んできましたが、私は初心者であり、混乱しています。誰も助けることができますか?

答えて

0

XML解析ライブラリを見てみましょう。 Python用の高速ライブラリはlxmlです:

lxmlののXMLツールキットは、Cライブラリののlibxml2とlibxsltのために結合Python的です。これらのライブラリの速度とXML機能の完全性をネイティブのPython APIのシンプルさと組み合わせている点で独特ですが、主に互換性がありますが、よく知られているElementTree APIより優れています。

そして、例えばXPath表現を経由してto属性とcli:body要素のテキストを抽出します。

注:以前はXMLまたはXMLライブラリで作業したことがない場合は、自分で学習する時間を与えてください。 XMLは習得するのが最も簡単なことではありませんが、問題の正しいモデルを適用すると、コードがもっときれいになります。

+0

私はそれを見てみましょう。それはPythonの中でこれを行う方法がないことは驚くようです - 私は短期間で別の言語に取り組むことを心配しているので、これを言います(来週の予定のためにこれを行います - 私は噛むことができるよりも少し多い:/)。しかし、私は本当に答えを感謝し、それを読むでしょう。ありがとう! – spikem

+0

@spikem、あなたを恐れたくはありませんでしたが、結果として得られるXML処理はおそらく4行のコードに過ぎません(これを自分で試してみたが、あなたのコードは私のためにすぐには機能しませんでした)。さらに、PythonにはXML処理が組み込まれています([xml.dom.minidom](http://docs.python.org/library/xml.dom.minidom.html)を参照)。とにかく、幸運。 – miku

0

これにはXMLパーサーを使用します。 Pythonには、多くのXMLパーサー(Python標準ライブラリの内部と外部の両方)があります。標準ライブラリのXMLパッケージのドキュメントは、Structured Markup Processing Toolsにあります。

以下は、xml.etree.ElementTreeを使用した例です。その中で私はあなたのXMLについていくつかの仮定をしました(完全なツリーを提供していないので)。この例では、要素とその子要素が1つだけ取り込まれますが、これにより、conversationツリー全体を処理する方法がわかります。

from xml.etree.ElementTree import ElementTree 
import StringIO 

# This is all set up to have data for the example. 
msg = """<cli:message to="[email protected]" from="[email protected]" 
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 
'[email protected]' 

>>> body 
'uhh' 
+0

[申し訳ありませんが、スタックのコメントシステムに慣れていない、誤って提出しました、もっと入力してください、待って] 私はこれを持っているかどうかを見てみましょう: msgはメッセージにあるものを宣言しています。 msgfは文字列に変換しています ツリーはXML階層のmsgf文字列を解析しています(?) "to"は "msg"で宣言された特定の "to"属性を探していて、 "body"は同じことをしています。 これで、すべてのフィールドを宣言し、すべてのチャットに適用する方法を理解する必要があります。 ありがとうございました! – spikem

関連する問題