質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

1325閲覧

メールのやり取りを抜き出すには

Kirari

総合スコア32

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/08/10 03:38

編集2020/08/10 04:43

前提・実現したいこと

https://teratail.com/questions/283666の続きになります。
メールのやり取りを抜き出し、エクセルに書き出したいのです。
メールはReplyが多く含んでるもので、ソースは以下のようになっています。

【メール】
(1)差出人:
日付:
宛先:
内容:

RE(2)差出人:
日付:
宛先:
内容:

RE(3)差出人:
日付:
宛先:
内容:

【ソース】

<div>(1)差出人: 日付: 宛先: 内容: <div>(2)差出人: 日付: 宛先: 内容: <div>(3)差出人: 日付: 宛先: 内容:

抜き出し方法は先頭にある<div>~次の<div>までの塊で抜こうとしましたが、うまくいかず悩んでいます。
アドバイス、コメントをお願いいたします。

text.txt

#(1)のメール <div name="messageReplySection">-------転送メール--------<br/> <b>差出人:</b>RRRRRRRR<br/> <b>日付:</b>RRRRRRRR<br/> <b>宛先:</b>RRRRRRRR<br/> <b>件名:</b>RRRRRRRR<br/> <p class="MsoNormal">RRRRRRRRRR</span></p> <p class="MsoNormal">RRRRRRRRRR</span></p> <p class="MsoNormal">RRRRRRRRRR</span></p> #(2)のメール <div> <b>差出人:</b>RRRRRRRR<br/> <b>日付:</b>RRRRRRRR<br/> <b>宛先:</b>RRRRRRRR<br/> <b>件名:</b>RRRRRRRR<br/> <p class="MsoNormal">RRRRRRRRRR</span></p> <p class="MsoNormal">RRRRRRRRRR</span></p> <p class="MsoNormal">RRRRRRRRRR</span></p> #(3)のメール <div name="messageReplySection">-------転送メール--------<br/> <b>差出人:</b>RRRRRRRR<br/> <b>日付:</b>RRRRRRRR<br/> <b>宛先:</b>RRRRRRRR<br/> <b>件名:</b>RRRRRRRR<br/> <p class="MsoNormal">RRRRRRRRRR</span></p> <p class="MsoNormal">RRRRRRRRRR</span></p> <p class="MsoNormal">RRRRRRRRRR</span></p> #(4)のメール <div> ・・・・・・

発生している問題・エラーメッセージ

File "C:/Users/XXXXXX/.spyder-py3/YYYYY.py", line 11, in <module> txt=data.read() File "C:\ProgramData\Anaconda3\lib\codecs.py", line 322, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x92 in position 32: invalid start byte (2020/08/10追記)

該当のソースコード

python3.7

1 2data=open('C:/Users/XXXXXX/Desktop/text.txt',"r",encoding='utf-8') 3 4txt=data.read() 5data.close() 6 7with open('C:/Users/XXXXXX/Desktop/text.txt',"w") as f: 8 txt = txt.replace('<div name="messageReplySection">','<div>') 9 f.write(txt) 10 11mojie=[] 12cur_pos=0 13while True : 14 target_tag = '<div>' 15 closing_tag = '<div>' 16 start_pos = txt[cur_pos:].find(target_tag) 17 end_pos = txt[cur_pos:].find(closing_tag) 18 if (start_pos == -1) or (end_pos == -1): 19 break 20 mojie.append(txt[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos]) 21 22 cur_pos = cur_pos + end_pos + len(closing_tag) 23 24 25import xlsxwriter 26wb = xlsxwriter.Workbook('C:/Users/XXXXXX/Desktop/out.xlsx') 27ws1 = wb.add_worksheet('sheet') 28 29i=0 30for a in filter(lambda x:x != "",mojie): 31 i=i+1 32 ws1.write(i, 0, a)

試したこと

メールの塊の文末に</div>をつけようとしたが他のソースも変換してしまい、うまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

https://teratail.com/questions/283666の追加質問です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2020/08/10 03:50

「text.txt」ファイルのエンコーディングを記載ください。 分からない場合はWindows10のメモ帳で開いてください。画面右下に表示されます。
meg_

2020/08/10 04:05

エラー発生場所はどこですか?
Kirari

2020/08/10 04:44

ご指摘ありがとうございます。追記いたしました。
meg_

2020/08/10 05:46

他の方の指摘にありますように、ファイルの文字コードに問題があるかと思います。'utf-8'で読み込みたいならファイルの文字コードを'utf-8'にしてください。そうでないならファイルの文字コードにencodingを合わせましょう。
Kirari

2020/08/10 06:02

ご指摘ありがとうございます。すみません。アドバイスいただいた、Windows10メモ帳で開いたところ、”=E9=AA=81=”の英数字が出てきました、ということは、メールからの取り出しはこの英数字から考えていかないといけないんですね? 2つの英数字の塊→文字に変換→取り出しという流れでしょうか?
can110

2020/08/10 06:54

質問本文には「text.txt」ファイルの内容が提示されていますが、これはどのようなエディタで開いて貼り付けたものでしょうか?
Kirari

2020/08/10 07:00

ありがとうございます。 使用しているメールソフトで該当メールを表示、 設定画面内にあるページのソース表示を選択、 表示された画面をコピペしたものです。
can110

2020/08/10 07:07

この質問の閲覧者はメールから「text.txt」への変換手順(規則)が分からないので メールのことは忘れて「text.txt」だけを考えてください。 「text.txt」をメモ帳で開くと「=E9=AA=81=~」と表示されるということでしょうか?
Kirari

2020/08/10 07:23 編集

すみません、ありがとうございます。 >「text.txt」をメモ帳で開くと「=E9=AA=81=~」と表示されるということでしょうか? はい、そうです。
can110

2020/08/10 07:27

質問本文には「text.txt」ファイルの内容として「<div name="messageReplySection">-------転送メール--------<br/>」といった表示がされたものが記載されていますが、これはどのようなソフトで「text.txt」を開いて表示させたものですか?
Kirari

2020/08/10 07:46 編集

すみません。ありがとうございます。 質問本文にあるのは、メールソフト「サンダーバード」でソース表示したものをコピペしたものです。
can110

2020/08/10 07:53

繰り返しになりますが、回答に必要な情報はメールをソース表示したものではなく ソースコードで読み込んでいる「text.txt」の内容です。その内容が分からないと回答は難しいです。 そもそもなのですが「text.txt」はどのような手順で作成したものでしょうか? あるいは「text.txt」をgithubなどでそのままの状態でアップされると適切な回答が得られやすくなると思われます。
Kirari

2020/08/11 01:54

ありがとうございます。 整理して再度質問させていただきます。 その際にはよろしくお願いいたします。 ひとつ教えていただきたいのですが、 ”=E6=T2=E9=AA=81=”の英数字が表示されたものをpythonで日本語に表示させるには、どうしたらいいのでしょうか。
can110

2020/08/11 02:11

「”=E6=T2=E9=AA=81=”の英数字が表示されたもの」がどのような文字コードで表現されたものかが分からないので分かりません。 次に質問を立てる場合は - 元のメール本文?からどのようにして「text.txt」を作成したのか? - 「text.txt」の文字コードは何か? を記載するとよいかと思います。
guest

回答1

0

以下の方法で解決しました。
まず、差出人、日付、宛先、件名を変更します。

python

1 2data=open('C:/Users/XXXXXXXXX/Desktop/text.txt',"r") 3txt=data.read() 4 5with open('C:/Users/XXXXXXXXX/Desktop/text.txt',"w") as f: 6 txt = txt.replace('差出人','From').replace('日付','Sent').replace('宛先','To').replace('件名','Subject') 7 f.write(txt) 8 9data.close()

メールの本文を取り出すための作業をします。

python

1 2data=open('C:/Users/XXXXXXXXX/Desktop/text.txt',"r") 3txt=data.read() 4 5with open('C:/Users/XXXXXXXXX/Desktop/text.txt',"w") as f: 6 txt = txt.replace('From','</div>\nFrom').replace('Subject','Subject\n<div>') 7 f.write(txt) 8 9data.close()

python

1 2data=open('C:/Users/XXXXXXXXXX/Desktop/text.txt',"r") 3txt=data.read() 4 5with open('C:/Users/XXXXXXXXXX/Desktop/text.txt',"w") as f: 6 txt += '</div>' 7 f.write(txt) 8 9data.close()

メールの本文部分を取り出します。

python

1 2import xlsxwriter 3data = open('C:/Users/XXXXXXXXXX/Desktop/text.txt', "r") 4 5res=data.read() 6 7mojie=[] 8cur_pos=0 9while True : 10 target_tag = '<div>' 11 closing_tag = '</div>' 12 start_pos = res[cur_pos:].find(target_tag) 13 end_pos = res[cur_pos:].find(closing_tag) 14 if (start_pos == -1) or (end_pos == -1): 15 break 16 mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos]) 17 18 cur_pos = cur_pos + end_pos + len(closing_tag) 19 20wb = xlsxwriter.Workbook('C:/Users/XXXXXXXXXX/Desktop/out1.xlsx') 21ws1 = wb.add_worksheet('sheet') 22 23i=0 24for a in filter(lambda x:x != "",mojie): 25 i=i+1 26 ws1.write(i, 0, a) 27 28wb.close()

メールのヘッダー部分を取り出します。

python

1import xlsxwriter 2data = open('C:/Users/XXXXXXXXXXXX/Desktop/text.txt', "r") 3 4wb = xlsxwriter.Workbook('C:/Users/XXXXXXXXXXXXXX/Desktop/out.xlsx') 5ws1 = wb.add_worksheet('sheet') 6 7row_index = 0 8 9for i in data.readlines(): 10 if i.startswith("From: "): 11 From = i[len("From: "):-1] 12 ws1.write(row_index, 0, From) 13 14 if i.startswith("Sent: "): 15 Sent = i[len("Sent: "):-1] 16 ws1.write(row_index, 1, Sent) 17 18 if i.startswith("To: "): 19 To = i[len("To: "):-1] 20 ws1.write(row_index, 2, To) 21 22 if i.startswith("Cc: "): 23 Cc = i[len("Cc: "):-1] 24 ws1.write(row_index, 3, Cc) 25 26 if i.startswith("Subject: "): 27 Subject = i[len("Subject: "):-1] 28 ws1.write(row_index, 4, Subject) 29 30 31 row_index = row_index + 1 32 33wb.close() 34data.close()

参考
https://teratail.com/questions/284286

投稿2020/08/14 03:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問