0

我正在尝试解码我​​在 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

4

1 回答 1

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()值的表示形式,它将任何不代表可打印 ASCII 代码点的字节替换转义\x..序列;有些被替换为较短的两个字符转义符,例如\rand \n。这使得表示既可以作为 Python 字节文字重复使用,也更容易记录到未设置为国际字符集的文件和终端。

print()为您处理编码。直接打印.prettify()输出即可。

如果将 Unicode 打印到您的终端或控制台不起作用,而是引发 a UnicodeDecodeError,则您的终端或控制台未配置为正确处理 Unicode 文本。请参阅PrintFail Python Wiki 页面进行故障排除。

于 2013-05-18T22:08:19.993 回答