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

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

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

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

Q&A

解決済

1回答

259閲覧

HTMLからのテキスト抽出タイミングで同じHTMLから他の条件を満たしたテキストの抽出

gran-1123

総合スコア18

Python 3.x

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

0グッド

0クリップ

投稿2019/01/31 06:21

前提・実現したいこと

現在、入力となるデータから「機動戦士ガンダム」シリーズに関係するテキストのみを抽出して、リストにまとめて出力するプログラムを作成しています。

そこで「results_hi(年代が格納される)に要素が格納されたタイミングのみ、抽出した行にresults_t(作品名が格納)とresults_ha(出来事が格納)の要素が格納される」処理を実施したいと考えています。

簡単に言うならば、「年代と同じ数だけ作品名と出来事を格納し、それ以上の要素抽出を抑制する」ことが目的となっています。

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

「該当のソースコード」の項目に記したように、年代の要素のみしか抽出されず、想定どおりに抽出してくれません。
問題となっているコードは以下の通りです。

if results_hi.append(re.findall(absobe_pattern_history, text)):#条件に適合した文(年号)を抽出、results_hiに格納 results_t.append(re.findall(absobe_pattern_title, text))#同上(作品名)、results_tに格納 results_ha.append(re.findall(absobe_pattern_happen, text))#同上(出来事)、results_haに格納

該当のソースコード

python3

1#coding:utf-8 2import re 3from bs4 import BeautifulSoup 4import pandas as pd 5 6results_hi = []#年号を格納しておく関数 7results_t = []#作品タイトルを格納しておく関数 8results_ha = []#出来事を格納しておく関数 9 10absobe_pattern_history = 'U.C.[0-9]{4}|宇宙世紀[0-9]{4}'#宇宙世紀の年号 11 12absobe_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,}|ガンダム・センチネル'#作品タイトル抽出パターン 13 14absobe_pattern_happen = '[\t\n\r\f\v一-龥ァ-ンa-zA-Z_ー・]{1,}戦争|[\t\n\r\f\v一-龥ァ-ンa-zA-Z_ー・]{1,}戦役|[\t\n\r\f\v一-龥ァ-ンa-zA-Z_ー・]{1,}紛争|[\t\n\r\f\v一-龥ァ-ンa-zA-Z_ー・]{1,}抗争|[\t\n\r\f\v一-龥ァ-ンのa-zA-Z_ー・]{1,}事件|[\t\n\r\f\v一-龥ァ-ンのa-zA-Z_ー・]{1,}反乱'#出来事抽出パターン 15 16# encoding は取得したページの文字コードを選択 17filepath = '/home/urai/crawling/gandamu/gandamu uchuuseiki/26.html' 18with open(filepath , encoding='utf-8') as f: 19 html = f.readlines() 20 for i in html: 21 soup = BeautifulSoup(i, 'html.parser')#SoupでHTMLからデータを取る 22 for text in soup.find_all(text=True):#Tabを取り除く 23 text.strip()#テキストであるか判定 24 #print(text) 25 if results_hi.append(re.findall(absobe_pattern_history, text)):#条件に適合した文(年号)を抽出、results_hiに格納 26 results_t.append(re.findall(absobe_pattern_title, text))#同上(作品名)、results_tに格納 27 results_ha.append(re.findall(absobe_pattern_happen, text))#同上(出来事)、results_haに格納 28 f.close() 29 30 UC_history = [hi[0] for hi in results_hi if hi != []]#抽出データから空のリストを取り除いた上で、入れ子構造を解消 31 32 UC_title = [t[0] for t in results_t if t != []]#抽出データから空のリストを取り除いた上で、入れ子構造を解消 33 34 UC_happen = [ha[0] for ha in results_ha if ha != []]#抽出データから空のリストを取り除いた上で、入れ子構造を解消 35 36 UCH = ",".join(UC_history)#置き換え処理のために一度リストを一つの文字列にする 37 UC_history2 = re.sub(r'宇宙世紀([0-9]{4})', r'U.C.\1',UCH)#"宇宙世紀"の部分を"U.C."に置き換え 38 UCH2 = UC_history2.split(",") 39 40 his_list = sorted(set(UCH2), key=UCH2.index)#リスト内部の重複を排除 41 tit_list = sorted(set(UC_title), key=UC_title.index)#上に同じ 42 hap_list = sorted(set(UC_happen), key=UC_happen.index)#上に同じ 43 44 his_list.sort()#年代順に並び替える 45 46 print(his_list) 47 print(tit_list) 48 print(hap_list)
出力 his_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'] tit_list = [] hap_list = []

試したこと

ifの形式について詳しく調べましたが、わかりませんでした。

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

pythonのバージョンは3.6.5です。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

if文の条件としてresults_hi.append()を書いてありますが
append()の返り値は常にNoneですので、if文の中に入りません。
下のように書きましょう。

Python

1matchedList = re.findall(absobe_pattern_history, text) 2if len(matchedList): 3 results_hi.append(matchedList) 4 results_t.append() 5 results_ha.append()

投稿2019/01/31 07:00

編集2019/01/31 07:06
firedfly

総合スコア1131

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

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

gran-1123

2019/01/31 07:03

説明ありがとうございます。 では、どのような条件式にすれば「results_hiに要素が入った時だけ下二つの要素を抽出する」ようにできますでしょうか?
firedfly

2019/01/31 07:08

findallから返ってくるのはマッチした文字列のリストですので、その数で判定すればいいでしょう。 コードを修正しました。ただ、これすら見当がつかないのはプログラミングの基礎勉強が足りないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問