2017-09-20 4 views
1

htmlタグのない電子メールの本文を取得する方法。Pythonは未処理の電子メールを解析し、本文のテキストコンテンツを取得します

私はメールを解析するために以下のコードを試しましたが、本体全体として '------ = _ Part_2'セクションを取得しました。

私のコード

import email 
message = email.message_from_string(text) 
print_payload(message) 

def print_payload(message): 
    print('******') 
    if message.is_multipart(): 
     for payload in message.get_payload(): 
      print_payload(payload) 
    else: 
     print message.get_payload() 
     for part in message.walk(): 
      if part.get_content_type(): 
       body = str(part.get_payload()) 
       print(body) 
    print('******') 

実際の電子メールの本文:

別のテストメール。
おかげで、
Munesh

生のEメール:事前に

Return-Path: [email protected] Date: Mon, 18 Sep 2017 23:07:16 +0000 From: [email protected] To: [email protected] Cc: [email protected] Message-ID: <[email protected]> Subject: My email subject MIME-Version: 1.0 Content-Type: application/ms-tnef Content-Transfer-Encoding: binary X-MS-Exchange-Organization-SCL: -1 X-MS-Exchange-Organization-MessageDirectionality: Originating Thread-Topic: My email subject X-Forefront-Antispam-Report: SFV:SKI;SCL:-1; X-MS-PublicTrafficType: Email X-MS-Exchange-Organization-Antispam-Report: SFV:SKI;SCL:-1; Accept-Language: en-US Content-Language: en-US 

------=_Part_2_123.456 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit 

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="Generator" content="Microsoft Word 14 (filtered medium)"><style><!-- /* Font Definitions */ @font-face 
     {font-family:Calibri; 
     panose-1:2 15 5 2 2 2 4 3 2 4;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal 
     {margin:0in; 
     margin-bottom:.0001pt; 
     font-size:11.0pt; 
     font-family:"Calibri","sans-serif";} a:link, span.MsoHyperlink 
     {mso-style-priority:99; 
     color:blue; 
     text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed 
     {mso-style-priority:99; 
     color:purple; 
     text-decoration:underline;} span.EmailStyle17 
     {mso-style-type:personal-compose; 
     font-family:"Calibri","sans-serif"; 
     color:windowtext;} .MsoChpDefault 
     {mso-style-type:export-only; 
     font-family:"Calibri","sans-serif";} @page WordSection1 
     {size:8.5in 11.0in; 
     margin:1.0in 1.0in 1.0in 1.0in;} div.WordSection1 
     {page:WordSection1;} 
--></style><!--[if gte mso 9]><xml><o:shapedefaults v:ext="edit" spidmax="1026" /></xml><![endif]--><!--[if gte mso 9]><xml><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1" /></o:shapelayout></xml><![endif]--></head><body lang="EN-US" link="blue" vlink="purple"><div class="WordSection1"><p class="MsoNormal">Another test mail.<o:p></o:p></p><p class="MsoNormal"><o:p>&nbsp;</o:p></p><p class="MsoNormal">Thanks,<o:p></o:p></p><p class="MsoNormal">Munesh<o:p></o:p></p><p class="MsoNormal"><o:p>&nbsp;</o:p></p></div></body></html> 

------=_Part_2_123.456-- 

感謝。

答えて

1

BeautifulSoupライブラリを使用すると、実際にはテキストを解析するのが難しくありません。ライブラリをお持ちでない場合は、まずpip install bs4をご確認ください。その後、それはあまりにも難しいことではありません。BeautifulSoupが雄弁にHTML要素を選択することができ、そこから構文解析木を、作成されない何

from bs4 import BeautifulSoup 
def print_payload(message): 
    print('******') 
    if message.is_multipart(): 
     for payload in message.get_payload(): 
      print_payload(payload) 
    else: 
     print message.get_payload() 
     for part in message.walk(): 
      if part.get_content_type(): 
       body = str(part.get_payload()) 
       soup = BeautifulSoup(body) 
       paragraphs = soup.find_all('p') 
       for paragraph in paragraphs: 
        print(paragraph.text) 
    print('******') 

。したがって、電子メールに他のhtml要素がある場合は、それらを検索してすべてのデータを取得する必要があります。しかし、この単純な電子メールでは、タグ 'p'ですべてのhtml要素を見つけるだけで十分です。

+0

ありがとうございます。しかし、それは部分的に働いています。タグ 'p'を検索すると、Part_2やContent-TypeのようなHTMLの外側の最初のテキストも印刷されます。あなたはメールの本文を取得する方法を私に案内することができます – Munesh

+0

うーん、私はなぜそれが起こっているのか分かりません。最初の段落をスキップするとどうなりますか? Ie .: '段落[1:]の段落の場合 ' –

+0

段落[1:]が機能します。しかし、これは適切な修正よりもハックに似ています。とにかくありがとう。あなたがより良い方法を見つけたら教えてください。 – Munesh

関連する問題