Удаление посторонних символов из gchats, извлеченных через imap с Python - PullRequest
0 голосов
/ 11 декабря 2011

Я работаю над проектом, который загружает стенограммы чата из gmail через imap. Я успешно вошел в систему и отобразил самую последнюю расшифровку стенограммы с помощью следующего кода:

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

Вывод включает в себя кучу болтовни, от которой я хочу избавиться. Например, это одна строка чата:

<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 голосов
/ 11 декабря 2011

Вы хотите использовать парсер XML для этого. В Python есть много парсеров XML на выбор (как внутри, так и вне стандартной библиотеки Python). Документация для пакетов XML в стандартной библиотеке находится в Инструменты обработки структурированной разметки .

Ниже приведен пример использования 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'
0 голосов
/ 11 декабря 2011

Посмотрите на библиотеки синтаксического анализа XML.Быстрая библиотека для python: lxml :

Инструментарий lxml XML представляет собой Pythonic-привязку для библиотек C libxml2 и libxslt.Он уникален тем, что сочетает в себе скорость и полноту возможностей XML этих библиотек с простотой нативного API-интерфейса Python, в основном совместимого, но превосходящего хорошо известный API ElementTree.

Затем извлеките *Например, атрибут 1009 * и текст элемента cli:body с помощью выражений XPath .

Примечание. Если вы никогда раньше не работали с XML или библиотеками XML, дайте себе некоторое время на изучение,XML - не самая простая вещь для освоения, но применение правильной модели для решения проблемы, я полагаю, сделает ваш код намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...