给定 Python 2.6 中的 RFC822 消息,我怎样才能获得right文本/纯内容部分?基本上,我想要的算法是这样的:
message = email.message_from_string(raw_message)
if has_mime_part(message, "text/plain"):
mime_part = get_mime_part(message, "text/plain")
text_content = decode_mime_part(mime_part)
elif has_mime_part(message, "text/html"):
mime_part = get_mime_part(message, "text/html")
html = decode_mime_part(mime_part)
text_content = render_html_to_plaintext(html)
else:
# fallback
text_content = str(message)
return text_content
在这些事情中,我有get_mime_part
and has_mime_part
下来,但我不太确定如何从 MIME 部分获取解码后的文本。我可以得到encoded文本使用get_payload()
,但如果我尝试使用decode
的参数get_payload()
方法(参见the doc http://docs.python.org/library/email.message.html#email.message.Message.get_payload)当我在文本/纯文本部分调用它时出现错误:
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
email/message.py", line 189, in get_payload
raise TypeError('Expected list, got %s' % type(self._payload))
TypeError: Expected list, got <type 'str'>
此外,我不知道如何获取 HTML 并将其尽可能接近地呈现为文本。
在多部分电子邮件中,email.message.Message.get_payload()
返回一个列表,每个部分包含一个项目。最简单的方法是遍历消息并获取每个部分的有效负载:
import email
msg = email.message_from_string(raw_message)
for part in msg.walk():
# each part is a either non-multipart, or another multipart message
# that contains further parts... Message is organized like a tree
if part.get_content_type() == 'text/plain':
print part.get_payload() # prints the raw text
对于非多部分消息,无需执行所有操作。无论 content_type 是什么,您都可以直接进入 get_payload()。
msg = email.message_from_string(raw_message)
msg.get_payload()
如果内容经过编码,则需要通过None
作为第一个参数get_payload()
,后跟 True(解码标志是第二个参数)。例如,假设我的电子邮件包含 MS Word 文档附件:
msg = email.message_from_string(raw_message)
for part in msg.walk():
if part.get_content_type() == 'application/msword':
name = part.get_param('name') or 'MyDoc.doc'
f = open(name, 'wb')
f.write(part.get_payload(None, True)) # You need None as the first param
# because part.is_multipart()
# is False
f.close()
至于获得 HTML 部分的合理纯文本近似值,我发现html2text http://www.aaronsw.com/2002/html2text/效果非常好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)