前提・実現したいこと
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/ツールのバージョンなど)
「text.txt」ファイルのエンコーディングを記載ください。
分からない場合はWindows10のメモ帳で開いてください。画面右下に表示されます。
エラー発生場所はどこですか?
ご指摘ありがとうございます。追記いたしました。
他の方の指摘にありますように、ファイルの文字コードに問題があるかと思います。'utf-8'で読み込みたいならファイルの文字コードを'utf-8'にしてください。そうでないならファイルの文字コードにencodingを合わせましょう。
ご指摘ありがとうございます。すみません。アドバイスいただいた、Windows10メモ帳で開いたところ、”=E9=AA=81=”の英数字が出てきました、ということは、メールからの取り出しはこの英数字から考えていかないといけないんですね?
2つの英数字の塊→文字に変換→取り出しという流れでしょうか?
質問本文には「text.txt」ファイルの内容が提示されていますが、これはどのようなエディタで開いて貼り付けたものでしょうか?
ありがとうございます。
使用しているメールソフトで該当メールを表示、
設定画面内にあるページのソース表示を選択、
表示された画面をコピペしたものです。
この質問の閲覧者はメールから「text.txt」への変換手順(規則)が分からないので
メールのことは忘れて「text.txt」だけを考えてください。
「text.txt」をメモ帳で開くと「=E9=AA=81=~」と表示されるということでしょうか?
すみません、ありがとうございます。
>「text.txt」をメモ帳で開くと「=E9=AA=81=~」と表示されるということでしょうか?
はい、そうです。
質問本文には「text.txt」ファイルの内容として「<div name="messageReplySection">-------転送メール--------<br/>」といった表示がされたものが記載されていますが、これはどのようなソフトで「text.txt」を開いて表示させたものですか?
すみません。ありがとうございます。
質問本文にあるのは、メールソフト「サンダーバード」でソース表示したものをコピペしたものです。
繰り返しになりますが、回答に必要な情報はメールをソース表示したものではなく
ソースコードで読み込んでいる「text.txt」の内容です。その内容が分からないと回答は難しいです。
そもそもなのですが「text.txt」はどのような手順で作成したものでしょうか?
あるいは「text.txt」をgithubなどでそのままの状態でアップされると適切な回答が得られやすくなると思われます。
ありがとうございます。
整理して再度質問させていただきます。
その際にはよろしくお願いいたします。
ひとつ教えていただきたいのですが、
”=E6=T2=E9=AA=81=”の英数字が表示されたものをpythonで日本語に表示させるには、どうしたらいいのでしょうか。
「”=E6=T2=E9=AA=81=”の英数字が表示されたもの」がどのような文字コードで表現されたものかが分からないので分かりません。
次に質問を立てる場合は
- 元のメール本文?からどのようにして「text.txt」を作成したのか?
- 「text.txt」の文字コードは何か?
を記載するとよいかと思います。