Этот код работает на фиктивной mbox, но не на gmail takeout mbox
У меня есть этот код, который будет переводить mbox в JSON. Цель состоит в том, чтобы перенести производимый JSON в базу данных Mongodb. Тем не менее, код был протестирован на фиктивной mbox "example.mbox", и он работал нормально. Тем не менее, когда пришло время протестировать его на реальном mbox, у меня был непреднамеренный вывод, который действительно производил файл JSON, но "Пропуск содержимого MIME в JSONification (multipart)".. Я не хочу ничего пропускать!
import sys
import mailbox
import email
import quopri
import json
import time
from BeautifulSoup import BeautifulSoup
from dateutil.parser import parse
MBOX = 'antonita.mbox'
OUT_FILE = MBOX + '.json'
def cleanContent(msg):
# Decode message from "quoted printable" format, but first
# re-encode, since decodestring will try to do a decode of its own
msg = quopri.decodestring(msg.encode('utf-8'))
# Strip out HTML tags, if any are present.
# Bail on unknown encodings if errors happen in BeautifulSoup.
try:
soup = BeautifulSoup(msg)
except:
return ''
return ''.join(soup.findAll(text=True))
# There's a lot of data to process, and the Pythonic way to do it is with a
# generator. See http://wiki.python.org/moin/Generators.
# Using a generator requires a trivial encoder to be passed to json for object
# serialization.
class Encoder(json.JSONEncoder):
def default(self, o): return list(o)
# The generator itself...
def gen_json_msgs(mb):
while 1:
msg = mb.next()
if msg is None:
break
yield jsonifyMessage(msg)
def jsonifyMessage(msg):
json_msg = {'parts': []}
for (k, v) in msg.items():
json_msg[k] = v.decode('utf-8', 'ignore')
# The To, Cc, and Bcc fields, if present, could have multiple items.
# Note that not all of these fields are necessarily defined.
for k in ['To', 'Cc', 'Bcc']:
if not json_msg.get(k):
continue
json_msg[k] = json_msg[k].replace('\n', '').replace('\t', '').replace('\r', '')\
.replace(' ', '').decode('utf-8', 'ignore').split(',')
for part in msg.walk():
json_part = {}
if part.get_content_maintype() != 'text':
print >> sys.stderr, "Skipping MIME content in JSONification ({0})".format(part.get_content_maintype())
continue
json_part['contentType'] = part.get_content_type()
content = part.get_payload(decode=False).decode('utf-8', 'ignore')
json_part['content'] = cleanContent(content)
json_msg['parts'].append(json_part)
# Finally, convert date from asctime to milliseconds since epoch using the
# $date descriptor so it imports "natively" as an ISODate object in MongoDB
then = parse(json_msg['Date'])
millis = int(time.mktime(then.timetuple())*1000 + then.microsecond/1000)
json_msg['Date'] = {'$date' : millis}
return json_msg
mbox = mailbox.UnixMailbox(open(MBOX, 'rb'), email.message_from_file)
# Write each message out as a JSON object on a separate line
# for easy import into MongoDB via mongoimport
f = open(OUT_FILE, 'w')
for msg in gen_json_msgs(mbox):
if msg != None:
f.write(json.dumps(msg, cls=Encoder) + '\n')
f.close()
print "All done"
Результаты OUT:
Skipping MIME content in JSONification (image)
Skipping MIME content in JSONification (image)
Skipping MIME content in JSONification (multipart)
Skipping MIME content in JSONification (multipart)
Skipping MIME content in JSONification (image)
Skipping MIME content in JSONification (image)
Skipping MIME content in JSONification (image)
Skipping MIME content in JSONification (multipart)
Skipping MIME content in JSONification (multipart)
Skipping MIME content in JSONification (multipart)
Skipping MIME content in JSONification (multipart)
All done
ПРИМЕЧАНИЕ. Как уже отмечалось, фраза "Я не хочу ничего пропускать" относится к тому факту, что я могу jSONify для большинства mbox, но не для multipart и изображений. Следовательно, часть в коде {для части в msg.walk(): ...} была помечена как пропущенная, чтобы продемонстрировать, что этот код действительно пропустил многочастные и изображения, так как без него я получал файл JSON без двоичных файлов для изображений и т. Д...Она не будет присутствовать в конечном коде, хотя, когда я пойму, как получить изображения и составные части в JSON.
1 ответ
Третье издание Mining Social Web
Я попытался создать работоспособный скрипт, который не только конвертирует MBOX в JSON, но даже извлекает вложения в пригодные для использования форматы. Ссылка на репо - https://github.com/PS1607/mbox-to-json
Прочтите файл README для инструкций по использованию.
Если вы хотите вместо этого преобразовать его в CSV, измените строку 55 в src/main.py сdf.to_json
кdf.to_csv