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

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

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

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

Q&A

解決済

1回答

1957閲覧

年表形式でデータをまとめたい

gran-1123

総合スコア18

Python 3.x

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

0グッド

2クリップ

投稿2018/11/29 09:02

編集2018/11/30 02:31

前提・実現したいこと

以下のプログラムによって抽出したデータをまとめたリストである
his_list
tit_list
hap_list
をhis_listを基準にした年表形式にまとめたいのですが、どのようなプログラムにすればよいのかわかりません。
想定しているレイアウトは以下のようなものです。
I  年代  I  出来事  I  作品名  
+-----------+--------------+-------------
I his_list[0] I tit_list[0] I hap_list[0]
I his_list[1] I tit_list[1] I hap_list[1]
(以下、リストの終わりまで続く、最も長いリストに年表の長さに合わせる)

どのようにすればよろしいでしょうか?

該当のソースコード

#coding:utf-8 import re from bs4 import BeautifulSoup import pandas as pd results_hi = []#年号を格納しておく関数 results_t = []#作品タイトルを格納しておく関数パターン1 results_ha = []#出来事を格納しておく関数パターン1 absobe_pattern_history = '^U.C.[0-9]{4}'#宇宙世紀の年号 absobe_pattern_title = '^機動戦士ガンダム'#作品タイトル抽出パターン1 absobe_pattern_title2 = '^機動戦士[\t\n\r\f\v一-龥ぁ-んァ-ンa-xA-ZΖ0-9_ー・]{1,}ガンダム'#作品タイトル抽出パターン2 absobe_pattern_title3 = '^機動戦士ガンダム[ \t\n\r\f\v一-龥ぁ-んァ-ンa-xA-ZΖ0-9_ー・]{1,}'#作品タイトル抽出パターン3 absobe_pattern_title4 = '^機動戦士[\t\n\r\f\v一-龥ぁ-んァ-ンa-xA-ZΖ0-9_ー・]{1,}ガンダム[ \t\n\r\f\v一-龥ァ-ンa-xA-ZΖ0-9_ー・]{1,}'#作品タイトル抽出パターン4 absobe_pattern_happen = '[\t\n\r\f\v一-龥ァ-ンa-xA-Z0-9_ー・]{1,}戦争'#出来事抽出パターン1 absobe_pattern_happen2 = '[\t\n\r\f\v一-龥ァ-ンa-xA-Z0-9_ー・]{1,}戦役'#出来事抽出パターン2 absobe_pattern_happen3 = '[\t\n\r\f\v一-龥ァ-ンa-xA-Z0-9_ー・]{1,}紛争'#出来事抽出パターン3 absobe_pattern_happen4 = '[\t\n\r\f\v一-龥ァ-ンa-xA-Z0-9_ー・]{1,}抗争'#出来事抽出パターン4 # encoding は取得したページの文字コードを選択 filepath = '/home/urai/crawling/gandamu/gandamu uchuuseiki/1.html' with open(filepath , encoding='utf-8') as f: html = f.readlines() for i in html: soup = BeautifulSoup(i, 'html.parser')#SoupでHTMLからデータを取る for text in soup.find_all(text=True):#Tabを取り除く if text.strip():#テキストであるか判定 results_hi.append(re.findall(absobe_pattern_history, text))#条件に適合した文を抽出、results_hiに格納 results_t.append(re.findall(absobe_pattern_title, text))#results_tに格納 results_t.append(re.findall(absobe_pattern_title2, text)) results_t.append(re.findall(absobe_pattern_title3, text)) results_t.append(re.findall(absobe_pattern_title4, text)) results_ha.append(re.findall(absobe_pattern_happen, text)) results_ha.append(re.findall(absobe_pattern_happen2, text)) results_ha.append(re.findall(absobe_pattern_happen3, text)) results_ha.append(re.findall(absobe_pattern_happen4, text)) f.close() UC_history = [hi[0] for hi in results_hi if hi != []]#抽出データから空っぽのデータを取り除いた上で、入れ子構造を解消 UC_title = [t[0] for t in results_t if t != []]#抽出データから空っぽのデータを取り除いた上で、入れ子構造を解消 UC_happen = [ha[0] for ha in results_ha if ha != []]#抽出データから空っぽのデータを取り除いた上で、入れ子構造を解消 his_list = sorted(set(UC_history), key=UC_history.index)#重複を排除 tit_list = sorted(set(UC_title), key=UC_title.index)#上に同じ hap_list = sorted(set(UC_happen), key=UC_happen.index)#上に同じ his_list.sort()#年代順に並び替える print(his_list) print(tit_list) print(hap_list) # 最長のリストにあわせNone要素を詰め込む his_l,tit_l,hap_l = [],[],[] from itertools import zip_longest for his,tit,hap in zip_longest(his_list,tit_list,hap_list): his_l.append(his) tit_l.append(tit) hap_l.append(hap) df = pd.DataFrame({'年代':his_l,'出来事':hap_l,'作品名':tit_l},columns=['年代','出来事','作品名']) df.to_html('ret.html',index=False)

###出力結果

his_list = ['U.C.0001', 'U.C.0079', 'U.C.0080', 'U.C.0081', 'U.C.0083', 'U.C.0084', 'U.C.0087', 'U.C.0088', 'U.C.0089', 'U.C.0090', 'U.C.0091', 'U.C.0092', 'U.C.0093', 'U.C.0094', 'U.C.0096', 'U.C.0097', 'U.C.0099', 'U.C.0100', 'U.C.0104', 'U.C.0107', 'U.C.0120', 'U.C.0122', 'U.C.0123', 'U.C.0133', 'U.C.0136', 'U.C.0140', 'U.C.0149', 'U.C.0169', 'U.C.0203', 'U.C.0218', 'U.C.0223', 'U.C.0653', 'U.C.1000'] tit_list = ['機動戦士ガンダム', '機動戦士Ζガンダム', '機動戦士クロスボーン・ガンダム', '機動戦士ムーンガンダム', '機動戦士Vガンダム', '機動戦士SDガンダム', '機動戦士ガンダムUC', '機動戦士ガンダム0080 ポケットの中の戦争', '機動戦士ガンダム 逆襲のシャア', '機動戦士ガンダム THE ORIGIN', '機動戦士ガンダム サンダーボルト', '機動戦士ガンダム 逆襲のシャア ベルトーチカ・チルドレン', '機動戦士ガンダム 閃光のハサウェイ', '機動戦士ガンダム シルエットフォーミュラ91', '機動戦士ガンダム 第08MS小隊', '機動戦士ガンダム MS IGLOO', '機動戦士ガンダム戦記 ', '機動戦士ガンダム0083 STARDUST MEMORY', '機動戦士ガンダム カタナ', '機動戦士ガンダム0083 REBELLION', '機動戦士ガンダム エコール・デュ・シエル', '機動戦士ガンダムΖΖ', '機動戦士ガンダムΖΖ外伝 ジオンの幻陽', '機動戦士ガンダム ', '機動戦士ガンダム MSV', '機動戦士ガンダム ジオンの再興', '機動戦士ガンダム U', '機動戦士ガンダム Twilight AXIS', '機動戦士ガンダムNT', '機動戦士ガンダム ムーンクライシス', '機動戦士ガンダムReon', '機動戦士ガンダムF90', '機動戦士ガンダムF91 フォーミュラー戦記0122', '機動戦士ガンダムF91', '機動戦士ガンダム CD', '機動戦士ガンダムさん', '機動戦士ガンダム 鉄血のオルフェンズ', '機動戦士ガンダムUC RE', '機動戦士ガンダムII 哀・戦士編', '機動戦士ガンダムIII めぐりあい宇宙編', '機動戦士ガンダム0083 ', '機動戦士クロスボーン・ガンダム外伝', '機動戦士Vガンダム外伝'] hap_list = ['一年戦争', 'レジオン建国戦争', 'ラプラス戦争', 'マフティー戦争', 'コスモ・バビロニア建国戦争', 'ザンスカール戦争', '独立戦争', '最終戦争', 'ジオン独立戦争', 'グリプス戦役', 'オールズモビル戦役', '第一次オールズモビル戦役', '第二次オールズモビル戦役', '木星戦役', 'デラーズ紛争', '高烈度紛争', '第一次ネオ・ジオン抗争', '第二次ネオ・ジオン抗争', '第三次ネオ・ジオン抗争', '内部抗争']

補足情報

pythonのバージョンは3.6.5
/home/urai/crawling/gandamu/gandamu uchuuseiki/1.htmlの内容は
Wikipedia記事「宇宙世紀」のHTMLデータとなっております。

解答によって年表形式で出力できるようになると思ったのですが、回答者のように出力できません。
何が問題でしょうか?イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

pandas.DataFrame.to_htmlを使うと、比較的簡単に表を作ることができます。

なお、ガンダム詳しくないのですが、以下のとおりデータが正しいか?は未確認です。

  • 出来事と作品名が逆では?
  • 年代と作品名、出来事の対応が合っていないのでは?

Python

1his_list = ['U.C.0001', 'U.C.0079', 'U.C.0080', 'U.C.0081', 'U.C.0083', 'U.C.0084', 'U.C.0087', 'U.C.0088', 'U.C.0089', 'U.C.0090', 'U.C.0091', 'U.C.0092', 'U.C.0093', 'U.C.0094', 'U.C.0096', 'U.C.0097', 'U.C.0099', 'U.C.0100', 'U.C.0104', 'U.C.0107', 'U.C.0120', 'U.C.0122', 'U.C.0123', 'U.C.0133', 'U.C.0136', 'U.C.0140', 'U.C.0149', 'U.C.0169', 'U.C.0203', 'U.C.0218', 'U.C.0223', 'U.C.0653', 'U.C.1000'] 2tit_list = ['機動戦士ガンダム', '機動戦士Ζガンダム', '機動戦士クロスボーン・ガンダム', '機動戦士ムーンガンダム', '機動戦士Vガンダム', '機動戦士SDガンダム', '機動戦士ガンダムUC', '機動戦士ガンダム0080 ポケットの中の戦争', '機動戦士ガンダム 逆襲のシャア', '機動戦士ガンダム THE ORIGIN', '機動戦士ガンダム サンダーボルト', '機動戦士ガンダム 逆襲のシャア ベルトーチカ・チルドレン', '機動戦士ガンダム 閃光のハサウェイ', '機動戦士ガンダム シルエットフォーミュラ91', '機動戦士ガンダム 第08MS小隊', '機動戦士ガンダム MS IGLOO', '機動戦士ガンダム戦記 ', '機動戦士ガンダム0083 STARDUST MEMORY', '機動戦士ガンダム カタナ', '機動戦士ガンダム0083 REBELLION', '機動戦士ガンダム エコール・デュ・シエル', '機動戦士ガンダムΖΖ', '機動戦士ガンダムΖΖ外伝 ジオンの幻陽', '機動戦士ガンダム ', '機動戦士ガンダム MSV', '機動戦士ガンダム ジオンの再興', '機動戦士ガンダム U', '機動戦士ガンダム Twilight AXIS', '機動戦士ガンダムNT', '機動戦士ガンダム ムーンクライシス', '機動戦士ガンダムReon', '機動戦士ガンダムF90', '機動戦士ガンダムF91 フォーミュラー戦記0122', '機動戦士ガンダムF91', '機動戦士ガンダム CD', '機動戦士ガンダムさん', '機動戦士ガンダム 鉄血のオルフェンズ', '機動戦士ガンダムUC RE', '機動戦士ガンダムII 哀・戦士編', '機動戦士ガンダムIII めぐりあい宇宙編', '機動戦士ガンダム0083 ', '機動戦士クロスボーン・ガンダム外伝', '機動戦士Vガンダム外伝'] 3hap_list = ['一年戦争', 'レジオン建国戦争', 'ラプラス戦争', 'マフティー戦争', 'コスモ・バビロニア建国戦争', 'ザンスカール戦争', '独立戦争', '最終戦争', 'ジオン独立戦争', 'グリプス戦役', 'オールズモビル戦役', '第一次オールズモビル戦役', '第二次オールズモビル戦役', '木星戦役', 'デラーズ紛争', '高烈度紛争', '第一次ネオ・ジオン抗争', '第二次ネオ・ジオン抗争', '第三次ネオ・ジオン抗争', '内部抗争'] 4 5# 最長のリストにあわせNone要素を詰め込む 6his_l,tit_l,hap_l = [],[],[] 7from itertools import zip_longest 8for his,tit,hap in zip_longest(his_list,tit_list,hap_list): 9 his_l.append(his) 10 tit_l.append(tit) 11 hap_l.append(hap) 12 13import pandas as pd 14df = pd.DataFrame({'年代':his_l,'出来事':tit_l,'作品名':hap_l},columns=['年代','出来事','作品名']) 15df.to_html('ret.html',index=False)

イメージ説明

投稿2018/11/30 00:11

can110

総合スコア38230

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

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

gran-1123

2018/11/30 02:07

とにかく表形式にするにはどうすればよいかを早急に知りたかっただけなので年代、作品名、出来事の辻褄合わせはしていません。これは後で調整する予定です。 それと、このまま実装してみたところ ModuleNotFoundError: No module named 'pandas' と出ました。 どう解決すればよろしいでしょうか?
can110

2018/11/30 02:11

pandasのインストールが必要です。 手順は「python pandas インストール (使っているOS)」で検索すればたくさん見つかります。
gran-1123

2018/11/30 02:15

pandasのインストールは無事にできたのですが出力欄が空白になってしまい表が出力されません。 どうすればよろしいでしょうか?
can110

2018/11/30 02:18

出力LANが何を指しているか不明なので画像を質問本文に貼って詳細な状況を説明ください。
gran-1123

2018/11/30 02:30

更新しました。 ソースコードも変更がありますので参照お願いします。
can110

2018/11/30 02:34

ret.htmlというファイルが出力されるので、それをブラウザで開いてください。
gran-1123

2018/11/30 02:38

できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問