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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1495閲覧

htmlデータの情報を分けてエクセルに書き出しを行いたい。

Kirari

総合スコア32

Python 3.x

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/07/18 01:42

前提・実現したいこと

下記htmlデータの<div>名前1(受信者)<br/>名前2(受信者)<br />名前3(受信者)<br />内容</div>を名前(受信者)と内容を分けてエクセルに書き出しを行いたい。

エクセルの書き出し:エクセルのA列に名前(発信者)、B列に日付と時間、C列に名前1(受信者)、名前2(受信者)、名前3(受信者)、D列に内容としたい。

pythonではエラーメッセージは出ませんが、エクセルはA列とB列だけ書き出しでき、C列、D列は書き出しされない状況です。ネットなどで情報も確認してみましたが、見つからずアドバイスコメントをいただけないでしょうか。

どうぞよろしくお願い致します。

【htmlデータ】

<div class="d-chat_timeline-post"> <p class="d-chat_timeline-name"> 名 前(発信者) </p> <ul class="d-chat_timeline-info"> <li>日付と時間 </li> </ul> <div>名前1(受信者)<br /> 名前2(受信者)<br /> 名前3(受信者)<br /> 内容</div>

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

pythonではエラーメッセージは出ませんが、エクセルはA列とB列だけ書き出しできる。C列、D列は書き出しされない。

該当のソースコード

python

1import os, tkinter, tkinter.filedialog, tkinter.messagebox 2root = tkinter.Tk() 3root.withdraw() 4fTyp = [("","*.html")] 5file = tkinter.filedialog.askopenfilename(filetypes = fTyp) 6fd=open(file,"r",encoding="utf-8") 7 8res=fd.read() 9from bs4 import BeautifulSoup 10 11mojie=[] 12cur_pos=0 13while True : 14 target_tag = '<p class="d-chat_timeline-name">' 15 closing_tag = '</p>' 16 start_pos = res[cur_pos:].find(target_tag) 17 end_pos = res[cur_pos:].find(closing_tag) 18 if (start_pos == -1) or (end_pos == -1): 19 break 20 mojie.append(res[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/XXXXXXX/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) 33 34mojie=[] 35cur_pos=0 36while True : 37 target_tag = '<ul class="d-chat_timeline-info">' 38 closing_tag = '</li>' 39 start_pos = res[cur_pos:].find(target_tag) 40 end_pos = res[cur_pos:].find(closing_tag) 41 if (start_pos == -1) or (end_pos == -1): 42 break 43 mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos]) 44 45 cur_pos = cur_pos + end_pos + len(closing_tag) 46 47i=0 48for a in filter(lambda x:x != "",mojie): 49 i=i+1 50 ws1.write(i, 1, a) 51 52mojie=[] 53cur_pos=0 54while True : 55 target_tag = '<div>' 56 closing_tag =<br/>' 57 start_pos = res[cur_pos:].find(target_tag) 58 end_pos = res[cur_pos:].find(closing_tag) 59 if (start_pos == -1) or (end_pos == -1): 60 break 61 mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos]) 62 63 cur_pos = cur_pos + end_pos + len(closing_tag) 64 65i=0 66for a in filter(lambda x:x != "",mojie): 67 i=i+1 68 ws1.write(i, 2, a) 69 70mojie=[] 71cur_pos=0 72while True : 73 target_tag =<br/>' 74 closing_tag =</div>' 75 start_pos = res[cur_pos:].find(target_tag) 76 end_pos = res[cur_pos:].find(closing_tag) 77 if (start_pos == -1) or (end_pos == -1): 78 break 79 mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos]) 80 81 cur_pos = cur_pos + end_pos + len(closing_tag) 82 83i=0 84for a in filter(lambda x:x != "",mojie): 85 i=i+1 86 ws1.write(i, 3, a) 87 88 89wb.close() 90

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

htmlでは<br />ですが、コード内では<br/>となっているため検索できないのでしょう。(/の前の空白有無)

投稿2019/07/31 16:51

meg_

総合スコア10579

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

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

Kirari

2019/08/08 02:06

ありがとうございます。空欄があったため、読み取ることができませんでした。解決することができました。
guest

0

コードが長くてどこに問題があるのかわかりませんが、
HTMLなのでbeautifulsoupを使ってテキスト探したほうが楽そうな気もします。

例:

python3

1from bs4 import BeautifulSoup 2 3html = """ 4<div class="d-chat_timeline-post"> 5<p class="d-chat_timeline-name"> 名 前(発信者) </p> 6<ul class="d-chat_timeline-info"> 7<li>日付と時間 8</li> 9</ul> 10<div>名前1(受信者)<br /> 11名前2(受信者)<br /> 12名前3(受信者)<br /> 13内容</div> 14""" 15 16soup = BeautifulSoup(html,"html.parser") 17 18colA = soup.p.get_text() 19soup.p.decompose() 20 21colB = soup.li.get_text() 22colB = colB.splitlines()[0] 23soup.ul.decompose() 24 25div_text = soup.div.get_text() 26colC = div_text.splitlines()[3] 27colD = div_text.splitlines()[4] 28colE = div_text.splitlines()[5] 29colF = div_text.splitlines()[6] 30 31print("colA:", colA) 32print("colB:", colB) 33print("colC:", colC) 34print("colD:", colD) 35print("colE:", colE) 36print("colF:", colF) 37 38# colA:  名 前(発信者)  39# colB: 日付と時間 40# colC: 名前1(受信者) 41# colD: 名前2(受信者) 42# colE: 名前3(受信者) 43# colF: 内容

投稿2019/07/19 01:25

jeanbiego

総合スコア3966

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

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

Kirari

2019/08/08 02:05

ありがとうございます。ご返信が遅くなり申し訳ございません。とても参考になります。やってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問