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

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

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

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

Q&A

1回答

767閲覧

ある要素の抽出された行に最も近い行あるいはテキストのみから別の要素を連動して抽出

gran-1123

総合スコア18

Python 3.x

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

0グッド

0クリップ

投稿2019/02/06 09:12

前提・実現したいこと

現在、「機動戦士ガンダム」シリーズに関するWebページのHTMLを一つにまとめたデータを入力として、
「作中の年代」「作中の出来事」「作品名」の三つの要素に適合するテキストを正規表現を用いて抽出してリストとして出力するプログラムを作成しています。

その際に、「作中の年代」に該当するテキストが抽出された際に、それに連動して、抽出された行(あるいはテキスト)から最も近い「作中の出来事」「作品名」の要素を抽出させることにより、「作中の年代」の要素数以上に「作中の出来事」「作品名」が抽出されないようにする処理を実装したいです。

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

しかし、前述の手法を実現させるための糸口さえ掴めず完全に途方にくれてしまいました。

該当のソースコード

python3

1#coding:utf-8 2import re 3from bs4 import BeautifulSoup 4import pandas as pd 5 6absobe_text = []#入力データを格納しておく関数 7results_hi = []#年号を格納しておく関数 8results_t = []#作品タイトルを格納しておく関数 9results_ha = []#出来事を格納しておく関数 10 11absobe_pattern_history = 'U.C.[0-9]{4}|宇宙世紀[0-9]{4}'#宇宙世紀の年号 12 13absobe_pattern_title = '機動戦士ガンダム[  \t\n\r\f\v一-龥ぁ-んァ-ンa-zA-ZΖ0-9_ー・.]{1,}|機動戦士ガンダム|機動戦士[\t\n\r\f\v一-龥ぁ-んァ-ンa-zA-ZΖ0-9_ー・.]{1,}ガンダム|機動戦士[\t\n\r\f\v一-龥ぁ-んァ-ンa-zA-ZΖ0-9_ー・.]{1,}ガンダム[  \t\n\r\f\v一-龥ァ-ンa-xA-ZΖ0-9_ー・]{1,}|ガンダム・センチネル'#作品タイトル抽出パターン 14 15absobe_pattern_happen = '[\t\n\r\f\v一-龥ァ-ンa-zA-Z0-9_ー・]{1,}戦争|[\t\n\r\f\v一-龥ァ-ンa-zA-Z0-9_ー・]{1,}戦役|[\t\n\r\f\v一-龥ァ-ンa-zA-Z0-9_ー・]{1,}紛争|[\t\n\r\f\v一-龥ァ-ンa-zA-Z0-9_ー・]{1,}抗争|[\t\n\r\f\v一-龥ァ-ンのa-zA-Z0-9_ー・]{1,}事件|[\t\n\r\f\v一-龥ァ-ンのa-zA-Z0-9_ー・]{1,}反乱'#出来事抽出パターン 16 17# encoding は取得したページの文字コードを選択 18filepath = '/home/urai/crawling/gandamu/gandamu uchuuseiki/26.html' 19with open(filepath , encoding='utf-8') as f: 20 html = f.readlines() 21 for i in html: 22 soup = BeautifulSoup(i, 'html.parser')#Soupでhtmlからデータを取る 23 for text in soup.find_all(text=True):#テキストのみを抽出 24 text.strip()#空白、改行を排除 25 absobe_text = text#別のリストに格納 26 #print(absobe_text) 27 matchedList_h = re.findall(absobe_pattern_history, absobe_text)#条件に適合した文(年号)を抽出、matchedList_hに格納、どうやって抽出された行を判定? 28 matchedList_ha = re.findall(absobe_pattern_happen, absobe_text)#条件に適合した文(年号)を抽出、matchedList_haに格納、どうやってmatchedList_hが判定した行の付近から抽出させる? 29 matchedList_t = re.findall(absobe_pattern_title, absobe_text)#条件に適合した文(年号)を抽出、matchedList_tに格納、どうやってmatchedList_hが判定した行の付近から抽出させる? 30 #if len(matchedList_h):#年代のリストが真になった数だけ抽出するようにする、これではダメ 31 results_hi.append(matchedList_h)#results_hiに格納 32 results_ha.append(matchedList_ha)#esults_haに格納 33 results_t.append(matchedList_t)#results_tに格納 34 f.close() 35 36 UC_history = [hi[0] for hi in results_hi if hi != []]#抽出データから空のリストを取り除いた上で、入れ子構造を解消 37 UC_title = [t[0] for t in results_t if t != []]#上に同じ 38 UC_happen = [ha[0] for ha in results_ha if ha != []]#上に同じ 39 40 UCH = ",".join(UC_history)#置き換え処理のために一度リストを一つの文字列にする 41 UC_history2 = re.sub(r'宇宙世紀([0-9]{4})', r'U.C.\1',UCH)#re.subで"宇宙世紀"の部分を"U.C."に置き換え 42 UCH2 = UC_history2.split(",")#リストに戻す、これで表記を統一 43 44 his_list = sorted(set(UCH2), key=UCH2.index)#sortedでリスト内部の重複を排除 45 tit_list = sorted(set(UCT), key=UCT.index)#上に同じ 46 hap_list = sorted(set(UCHA), key=UCHA.index)#上に同じ 47 48 his_list.sort()#his_listの中身を古い>新しいの順番に並び替える 49 50 print(his_list) 51 print(hap_list) 52 print(tit_list)

出力

['U.C.0001', 'U.C.0058', 'U.C.0063', 'U.C.0068', 'U.C.0071', 'U.C.0079', 'U.C.0080', 'U.C.0081', 'U.C.0082', 'U.C.0083', 'U.C.0084', 'U.C.0085', '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.0095', 'U.C.0096', 'U.C.0097', 'U.C.0099', 'U.C.0100', 'U.C.0103', 'U.C.0104', 'U.C.0105', 'U.C.0106', 'U.C.0107', 'U.C.0120', 'U.C.0121', 'U.C.0122', 'U.C.0123', 'U.C.0133', 'U.C.0136', 'U.C.0140', 'U.C.0143', 'U.C.0149', 'U.C.0153', 'U.C.0168', 'U.C.0169', 'U.C.0203', 'U.C.0218', 'U.C.0223', 'U.C.0653', 'U.C.1000'] ['ラプラス事件', '一年戦争', '南洋同盟の反乱', 'デラーズ紛争', 'グリプス戦役', 'ペズンの反乱', '第一次ネオ・ジオン抗争', 'レジオン建国戦争', '第二次ネオ・ジオン抗争', 'ラプラス戦争', 'マフティー戦争', 'オールズモビル戦役', '第一次オールズモビル戦役', '第二次オールズモビル戦役', 'ゼブラゾーン事件', 'コスモ・バビロニア建国戦争', '木星戦役', 'ザンスカール戦争', 'マハの反乱', 'ガイアの光事件', '独立戦争', '内部抗争', '高烈度紛争', '最終戦争', 'ジオン独立戦争', '1年戦争', '一週間戦争', 'ルウム戦役', '一週間戦争戦争', '宇宙戦争', '議会軍の反乱', '武力紛争', 'のラプラス事件', 'シャアの反乱', '年戦争', '30バンチ事件', '大戦争', '・ラプラス事件', '・一年戦争', 'の事件', '第一次ネオ・ジオン戦争', 'コスモ・バビロニア戦争', 'ザン・スカール戦争', 'バンチ事件', '未遂事件', '第二次ネオジオン抗争'] ['機動戦士ガンダム', '機動戦士Ζガンダム', '機動戦士ガンダムUC', '機動戦士クロスボーン・ガンダム', '機動戦士ガンダム0080 ポケットの中の戦争', '機動戦士Vガンダム', '機動戦士ガンダム 逆襲のシャア', '機動戦士ガンダム THE ORIGIN', '機動戦士ガンダム サンダーボルト', '機動戦士ガンダム 逆襲のシャア ベルトーチカ・チルドレン', '機動戦士ガンダム 閃光のハサウェイ', '機動戦士ガンダム シルエットフォーミュラ91', '機動戦士ガンダムF91', '機動戦士ガンダム 第08MS小隊', '機動戦士ガンダム MS IGLOO', '機動戦士ガンダム\u3000サンダーボルト', '機動戦士ガンダム0083 STARDUST MEMORY', '機動戦士ガンダム カタナ', '機動戦士ガンダム0083 REBELLION', '機動戦士ガンダム エコール・デュ・シエル', 'ガンダム・センチネル', '機動戦士ガンダムΖΖ', '機動戦士ガンダムΖΖ外伝 ジオンの幻陽', '機動戦士ガンダム ', '機動戦士ガンダム MSV', '機動戦士ガンダム ジオンの再興', '機動戦士ガンダム 新ジオンの再興', '機動戦士ムーンガンダム', '機動戦士ガンダム U.C.0094 アクロス・ザ・スカイ', '機動戦士ガンダム U.C.0096 ラスト・サン', '機動戦士ガンダム Twilight AXIS', '機動戦士ガンダムNT', '機動戦士ガンダム ムーンクライシス', '機動戦士ガンダムReon', '機動戦士ガンダムF90', '機動戦士ガンダム大事典', '機動戦士ガンダム MS IGLOO グラフィックファイル', '機動戦士ガンダム0079', '機動戦士ガンダム ムーンクライシス 下巻', '機動戦士ガンダム CD', '機動戦士ガンダムさん', '機動戦士ガンダム 鉄血のオルフェンズ', '機動戦士ガンダムUC RE', '機動戦士ガンダムII 哀・戦士編', '機動戦士ガンダムIII めぐりあい宇宙編', '機動戦士SDガンダム', '機動戦士ガンダム0083 ', '機動戦士ガンダム 第07板倉小隊', '機動戦士ガンダム THE ORIGIN MSD', '機動戦士ガンダム CROSS DIMENSION 0079 死にゆく者たちへの祈り', '機動戦士ガンダム外伝 THE BLUE DESTINY', '機動戦士ガンダム外伝 コロニーの落ちた地で', '機動戦士ガンダム外伝 宇宙', '機動戦士ガンダム外伝 ミッシングリンク', '機動戦士ガンダム EX', '機動戦士ガンダム MSジェネレーション', '機動戦士ガンダム Before One Year War', '機動戦士ガンダム オレら連邦愚連隊', '機動戦士ガンダム GROND ZERO コロニーの落ちた地で', '機動戦士ガンダム サンダーボルト外伝 砂鼠のショーン', '機動戦士ガンダム サンダーボルト外伝', '機動戦士ガンダム 黒衣の狩人', '機動戦士ガンダム FAR EAST JAPAN', '機動戦士ガンダム アグレッサー', '機動戦士ガンダム0080 ポケットの中の戦争 プラモデル解説書', '機動戦士ガンダム 第08MS小隊外伝 TRIVIAL OPERATION', '機動戦士ガンダム MS IGLOO ', '機動戦士ガンダム MS IGLOO 603', '機動戦士ガンダム MS IGLOO 2 重力戦線', '機動戦士ガンダム ファントム・ブレット', '機動戦士ガンダム ブレイジングシャドウ', '機動戦士ガンダム C.D.A. 若き彗星の肖像', '機動戦士ゼータガンダム', '機動戦士Oガンダム', '機動戦士ガンダム ハイ・ストリーマー', '機動戦士ガンダム 逆襲のシャア モビルスーツバリエーション', '機動戦士ガンダム短編集', '機動戦士ガンダム クラシックオペレーション', '機動戦士ガンダム シャアの帰還', '機動戦士ガンダムUC モビルスーツバリエーション', '機動戦士ガンダムF91 モビルスーツバリエーション', '機動戦士ガンダム ストーリーブック2巻', '機動戦士ガンダム ストーリーブック4巻', '機動戦士ガンダム モビルスーツバリエーション ', '機動戦士ガンダム CROSS DIMENSION 0079', '機動戦士ガンダム めぐりあい宇宙', '機動戦士ガンダム サイドストーリーズ', '機動戦士ガンダム ギレンの野望', '機動戦士ガンダムUC 星月と', '機動戦士ガンダムUC One of Seventy Two', '機動戦士ガンダムUC バンデシネ', '機動戦士ガンダム 戦場の絆', '機動戦士ぶよガンダム', '機動戦士ガンダム_MSV', '機動戦士ガンダム オンライン', '機動戦士ユニコーンガンダム', '機動戦士ガンダムTHE ORIGIN vol.1 始動編', '機動戦士ガンダム THE ORIGIN I ', '機動戦士ガンダム THE ORIGIN ', '機動戦士ガンダム MSイグルー', '機動戦士ガンダム MSイグルー ', '機動戦士ガンダム MS IGLOO2 重力戦線', '機動戦士ガンダム MSイグルー2 重力戦線 1 あの死神を撃て', '機動戦士ガンダム サンダーボルト DECEMBER SKY ', '機動戦士Zガンダム', '機動戦士ガンダムZZ', '機動戦士ガンダムユニコーン RE', '機動戦士ガンダムUC ', '機動戦士ガンダムF90 ', '機動戦士ガンダム\u3000シルエットフォーミュラ91 機動戦士ガンダム シルエットフォーミュラ91 ', '機動戦士ガンダムF91 クロスボーン・バンガード', '機動戦士ガンダム0083に登場した浪漫機体の魅力 ', '機動戦士ガンダムサンダーボルト', '機動戦士ガンダムTHEORIGIN', '機動戦士ガンダムMS IGLOO', '機動戦士ガンダム第08MS小隊', '機動戦士ガンダム0080ポケットの中の戦争', '機動戦士ガンダム逆襲のシャア', '機動戦士ガンダムTwilightAXIS', '機動戦士ガンダム外伝ミッシング・リンク', '機動戦士ガンダム外伝 ミッシング・リンク終章', '機動戦士ガンダムMSV', '機動戦士ガンダム UC0094 アクロス・ザ・スカイ', '機動戦士ガンダムムーンクライシス', '機動戦士ガンダム閃光のハサウェイ', '機動戦士ガンダムシルエット・フォーミュラF91', '機動戦士ガンダムUC フルアーマー・ユニコーンガンダム 1', '機動戦士ガンダム0083', '機動戦士ガンダムSEED', '機動戦士ガンダムSEED DESTINY', '機動戦士ガンダムOO', '機動戦士ガンダムAGE', '機動戦士ガンダム THE ORIGIN 誕生 赤い彗星', '機動戦士ガンダムUC 1', '機動戦士ガンダムMS イグルー', '機動戦士ガンダム迷珍場面まとめ', '機動戦士ガンダム\u3000サンダーボルト\u3000外伝', '機動戦士ガンダム\u3000第', '機動戦士ガンダム外伝 ザ・ブルー・ディスティニー', '機動戦士ガンダム ギレン暗殺計画', '機動戦士ガンダム 光芒のア・バオア・クー', '機動戦士ガンダム THE ORIGIN MSD ククルス・ドアンの島', '機動戦士ガンダム外伝', '機動戦士ガンダム\u3000', '機動戦士ガンダム外伝\u3000コロニーの落ちた地で', '機動戦士ガンダム外伝\u3000宇宙', '機動戦士ガンダム THE MSV ザ・モビルスーツバリエーション', '機動戦士ガンダム 名も無き戦場', '機動戦士ガンダム デイアフタートゥモロー ', '機動戦士ガンダム U.C.HARD GRAPH 鉄の駻馬', '機動戦士ガンダムC.D.A.\u3000若き彗星の肖像', '機動戦士ガンダム\u3000エコール・デュ・シエル', '機動戦士ガンダム ANAHEIM RECORD', '機動戦士ガンダム 逆襲のシャア\u3000ベルトーチカ・チルドレン', '機動戦士ガンダムUC\u3000虹にのれなかった男', '機動戦士ガンダムTHE ORIGIN シャアとキャスバル', '機動戦士ガンダムさん ニッポン', '機動戦士ガンダム ハイブリッド', '機動戦士ガンダム アッガイ北米横断2250マイル', '機動戦士ガンダムTHE ORIGIN 笑劇のまるごとシャア・セイラ編', '機動戦士ガンダムTHE ORIGIN 笑劇のまるごとシャア・セイラ編 著者', '機動戦士ガンダムTHE ORIGIN vol.1 始動編 posted with ヨメレバ 安彦 良和', '機動戦士ガンダム THE ORIGIN VI 誕生 赤い彗星 ', '機動戦士ガンダムNT ', '機動戦士ガンダムは', '機動戦士ガンダム THE ORIGIN VI 誕生 赤い彗星 posted with カエレバ 池田秀一 2018', '機動戦士ZZガンダム', '機動戦士ガンダム逆襲のシャア オススメ度', '機動戦士ガンダムU... \n', '機動戦士ガンダムUC パイロット', '機動戦士ガンダムUC ユニコーンガンダム 1', '機動戦士ガンダム NT', '機動戦士ガンダムF', '機動戦士ガンダム ', '機動戦士ガンダム 逆襲のシャア ', '機動戦士ガンダム 閃光のハサウェイ ', '機動戦士ガンダム0080\u3000ポケットの中の戦争', '機動戦士ガンダムジオリジン', '機動戦士ガンダムって感じがします', '機動戦士ガンダム THE ORIGIN シャア・セイラ編 I 青い瞳のキャスバル posted with カエレバ 田中真弓 株式会社サンライズ 2016', '機動戦士ガンダム MSイグルー2 重力戦線', '機動戦士ガンダム 第08MS小隊 ', '機動戦士ガンダム0080 ポケットの中の戦争 ', '機動戦士ガンダム サンダーボルト ', '機動戦士ガンダム0083 STARDUST MEMORY ', '機動戦士ガンダムΖΖ ', '機動戦士ガンダム 逆襲のシャア ', '機動戦士ガンダムとZガンダムで起きた戦争を生きてきたアムロとシャアの思惑が交錯するのがいいですね', '機動戦士ガンダムF91 ', '機動戦士ガンダムに関しては', '機動戦士ガンダム 第', '機動戦士ガンダム0083 スターダストメモリー', '機動戦士ガンダム00', '機動戦士ガンダム Zガンダム ... \n', '機動戦士ガンダム鉄血のオルフェンズの時代というのは宇宙新世紀なのですか']

試したこと

if len(matchedList_h):を用いて年代の要素が抽出された回数だけ他の要素の抽出を実行する処理を試そうとしましたが思うようにいきませんでした。

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

Pythonのバージョンは3.6.5です。
入力データである'/home/urai/crawling/gandamu/gandamu uchuuseiki/26.html'の中身は「機動戦士ガンダム」内の歴史である「宇宙世紀」について記された複数のWebページのHTMLデータを一つにまとめた物になります。

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

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

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

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

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

guest

回答1

0

「作中の年代」に該当するテキストが抽出された際に、それに連動して、抽出された行(あるいはテキスト)から最も近い「作中の出来事」「作品名」の要素を抽出させることにより、「作中の年代」の要素数以上に「作中の出来事」「作品名」が抽出されないようにする処理を実装したいです。

ステップを分ければよろしいのではないでしょうか。

  1. 項目の抽出

三つの項目を抽出、その際に、それぞれ出現した行番号やカラム数も保持する
2. 年代が出現した行と同じ行の出来事や作品名を抽出
・ 複数発見した場合、カラム数が近いものを抽出
・ 同じ行になければ、行を前後にズラして探す

投稿2019/02/06 10:35

t_obara

総合スコア5488

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

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

gran-1123

2019/02/07 03:01

手法は理解できたのですが、要素を抽出する際に使用しているre.findallと行数に該当するenumerateを併設した書き方が全くわかりません。 どのようにすればよろしいでしょうか?
t_obara

2019/02/07 03:30

findallでは面倒でしょうね。searchとかfinditerを利用してみてはいかがでしょうか。
gran-1123

2019/02/07 05:50

どちらもエラーを吐いてしまってまともに使えませんでした。 どちらを使うにしても、どのようにソースコードを書けばよいでしょうか?
t_obara

2019/02/07 07:02

エラーになったのであれば、貴殿のコードに問題があったということであり、文法上の使い方をお調べになるべきでしょう。その上で解決できないのであれば、問題となったコードを提示した上でそれについて問題を絞り別途質問をされてはいかがでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問