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

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

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

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

HTML

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

Q&A

解決済

2回答

499閲覧

htmlデータからエクセルへの書き出し エクセルに一列しか出力されない

Kirari

総合スコア32

Python 3.x

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

HTML

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

0グッド

0クリップ

投稿2019/07/11 19:36

前提・実現したいこと

htmlデータから特定の文字を抽出し、エクセルへ出力したいと考えています。

<p class="d-chat_timeline-name"> 名 前(発信者)1 </p>の欄をエクセルのA行に、 <li>日付と時間1</li>の欄をエクセルのB行に、 <div>名前1-1(受信者)<br />名前1-2(受信者)<br />名前1-3(受信者)<br />内容1</div>の欄をエクセルのC行に書き出したいのです。

プログラミングを実行したところ、<div>名前1-1(受信者)<br />名前1-2(受信者)<br />名前1-3(受信者)<br />内容1</div>の欄だけしか書き出しませんでした。
エラーコードもなく、どのようにしたらいいのかわかりません。
アドバイスいただけないでしょうか。どうぞよろしくお願いいたします。

<htmlデータ>

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

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

pythonでのエラーメッセージはありません。エクセル出力時にC行だけ出力される。

該当のソースコード

python

1# -*- coding: utf-8 -*- 2""" 3Spyderエディタ 4 5これは一時的なスクリプトファイルです 6""" 7 8import os, tkinter, tkinter.filedialog, tkinter.messagebox 9root = tkinter.Tk() 10root.withdraw() 11fTyp = [("","*.html")] 12file = tkinter.filedialog.askopenfilename(filetypes = fTyp) 13fd=open(file,"r",encoding="utf-8") 14 15res=fd.read() 16from bs4 import BeautifulSoup 17 18mojie=[] 19cur_pos=0 20while True : 21 target_tag = '<p class="d-chat_timeline-name">' 22 closing_tag = '</p>' 23 start_pos = res[cur_pos:].find(target_tag) 24 end_pos = res[cur_pos:].find(closing_tag) 25 if (start_pos == -1) or (end_pos == -1): 26 break 27 mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos]) 28 29 cur_pos = cur_pos + end_pos + len(closing_tag) 30 31 32import xlsxwriter 33wb = xlsxwriter.Workbook('C:/Users/XXXXXXXXXXX/Desktop/out.xlsx') 34ws1 = wb.add_worksheet('sheet') 35 36i=0 37for a in mojie: 38 i=i+1 39 ws1.write(i, 0, a) 40 41mojie=[] 42cur_pos=0 43while True : 44 target_tag = '<li>' 45 closing_tag = '</li>' 46 start_pos = res[cur_pos:].find(target_tag) 47 end_pos = res[cur_pos:].find(closing_tag) 48 if (start_pos == -1) or (end_pos == -1): 49 break 50 mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos]) 51 52 cur_pos = cur_pos + end_pos + len(closing_tag) 53 54 55import xlsxwriter 56wb = xlsxwriter.Workbook('C:/Users/XXXXXXXXXXX/Desktop/out.xlsx') 57ws2 = wb.add_worksheet('sheet') 58 59i=0 60for a in mojie: 61 i=i+1 62 ws2.write(i, 1, a) 63 64mojie=[] 65cur_pos=0 66while True : 67 target_tag = '<div>' 68 closing_tag = '</div>' 69 start_pos = res[cur_pos:].find(target_tag) 70 end_pos = res[cur_pos:].find(closing_tag) 71 if (start_pos == -1) or (end_pos == -1): 72 break 73 mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos]) 74 75 cur_pos = cur_pos + end_pos + len(closing_tag) 76 77 78import xlsxwriter 79wb = xlsxwriter.Workbook('C:/Users/XXXXXXXXXXX/Desktop/out.xlsx') 80ws3 = wb.add_worksheet('sheet') 81 82i=0 83for a in mojie: 84 i=i+1 85 ws3.write(i, 2, a) 86 87wb.close()

試したこと

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

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

closeで書き込みが行われるのに、クローズせずに開き直しているから最後のwriteしか反映されない

投稿2019/07/11 22:14

papinianus

総合スコア12705

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

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

Kirari

2019/07/11 23:40

書き出しすることができました。ありがとうございます。
guest

0

下記で解決しました。

import os, tkinter, tkinter.filedialog, tkinter.messagebox
root = tkinter.Tk()
root.withdraw()
fTyp = [("","*.html")]

file="/Users/XXXXXX/Desktop/message1.html"
fd=open(file,"r",encoding="utf-8")

res=fd.read()
from bs4 import BeautifulSoup

mojie=[]
cur_pos=0
while True :
target_tag = '<p class="d-chat_timeline-name">'
closing_tag = '</p>'
start_pos = res[cur_pos:].find(target_tag)
end_pos = res[cur_pos:].find(closing_tag)
if (start_pos == -1) or (end_pos == -1):
break
mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos])

cur_pos = cur_pos + end_pos + len(closing_tag)

target_tag = '<ul class="d-chat_timeline-info">'
closing_tag = '</li>'
start_pos = res[cur_pos:].find(target_tag)
end_pos = res[cur_pos:].find(closing_tag)
if (start_pos == -1) or (end_pos == -1):
break
mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos])

cur_pos = cur_pos + end_pos + len(closing_tag)

target_tag = '<div>'
closing_tag = '</div>'
start_pos = res[cur_pos:].find(target_tag)
end_pos = res[cur_pos:].find(closing_tag)
if (start_pos == -1) or (end_pos == -1):
break
mojie.append(res[cur_pos + start_pos + len(target_tag) : cur_pos + end_pos])

cur_pos = cur_pos + end_pos + len(closing_tag)

import xlsxwriter
wb = xlsxwriter.Workbook('/Users/XXXXXXX/Downloads/out.xlsx')
ws1 = wb.add_worksheet('sheet')

i=0
for a in mojie:
i=i+1
ws1.write(i, 0, a)

wb.close()

投稿2019/07/11 23:48

Kirari

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問