我正在尝试解码我在IMAP服务器上发送的电子邮件的html附件文件。
如果html文件包含普通字符,那么它的工作没有问题,但是如果你有一些法语é
字符,我就会这样:"vous a \xc3\xa9t\xc3\xa9 envoy\xc3\xa9e par"
我也出现了所有\n
\r
。
我使用beautifulsoup对html代码进行搜索。我还使用循环来检查所有邮件(此代码中不存在)
imap_server = imaplib.IMAP4_SSL("server",993)
imap_server.login(username, password)
imap_server.select("test")
result, data = imap_server.uid('search', None, "UnSeen")
latest_email_uid = data[0].split()[-1]
result, data = imap_server.uid('fetch', latest_email_uid, '(RFC822)')
raw_email = data[0][1]
raw_email=str(raw_email, 'UTF8')
msg = email.message_from_string(raw_email)
我走进邮件,如果我找到一些HTML,我从base64解码并发送给beautifulsoup。 之后我用utf-8转换打印它。如果我用latin-1替换encode。('utf-8')我也有特殊字符。
if msg.is_multipart():
for part in msg.walk():
if part.get_content_type() == 'text/html':
attachment= (part.get_payload(decode=1))
soup=BeautifulSoup(attachment)
print (soup.prettify().encode('utf-8'))
else:
print ("No HTML")
我尝试编码,解码很多字符集而没有一些好东西。
我也尝试使用base64.b64decode(text).decode('utf-16')
,但仍然使用相同的\xc3\xa9
答案 0 :(得分:2)
您会看到特殊字符,因为您正在编码为UTF-8或Latin-1:
>>> print('\xe9')
é
>>> print('\xe9'.encode('utf8'))
b'\xc3\xa9'
>>> print('\xe9'.encode('latin1'))
b'\xe9'
>>> print('Hello world!\n'.encode('utf8'))
b'Hello world!\n'
当打印字节文字时,Python显示值的repr()
表示,它替换不表示具有\x..
转义序列的可打印ASCII码点的任何字节;有些被替换为较短的双字符转义符,例如\r
和\n
。这使得该表示既可以作为Python字节文字重用,也可以更容易地记录到未设置为国际字符集的文件和终端。
print()
为您处理编码。只需直接打印.prettify()
输出 。
如果将Unicode打印到终端或控制台不起作用,而是引发UnicodeDecodeError
,则终端或控制台未配置为正确处理Unicode文本。请咨询PrintFail Python Wiki page进行问题排查。