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

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

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

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

Q&A

解決済

2回答

1701閲覧

複数の文字列検索(○○以外の○○)を実行したい

fantasista959

総合スコア12

Python 3.x

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

0グッド

0クリップ

投稿2018/05/11 15:38

文字列検索で複数単語でフィルタをかけたいのですが、コードを読んでもどう改善したらよいかわかりません。また、前提条件としてネット上のコードを拾って自分なりに理解したつもりですが、修正する際に戸惑いましたので、ご質問させて頂きました。下記にコードを載せます。

具体的な内容としまして。。。
EDINETよりXBRLデータを自動取得するコードで「有価証券報告書」のXBRLデータをダウンロードします。その際、もう一つ条件として「内国投資信託受益証券」を除いた「有価証券報告書」をダウンロードしたく修正を行っておりました。in条件を変えるべきか変えるとしてもnot inができるともネット上では具体的な記載が見当たりませんでした。
アドバイスをご教示頂けませんでしょうか?

また、この場所を変更すべきなのかなということで、私が思った場所を太字+斜体にて目印をつけております。

漠然とした質問で申し訳ありませんが、ご回答の程宜しくお願い致します。

import requests
import xml.etree.ElementTree as ET
import json
import os
import io
import re
import multiprocessing
from collections import defaultdict
from datetime import datetime as dt

proc = 1 # TODO:マルチプロセス制御(初期値:1並列)

def get_link_info_str(ticker_symbol, base_url):
url = base_url+ticker_symbol
response = requests.get(url)
return response.text

def get_link(tree, namespace, since):
yuho_dict = defaultdict(dict)
#entryタグ毎にforeach
for el in tree.findall('.//'+namespace+'entry'):

#titleタグに有価証券の文字があれば、後続処理を実行

** title = el.find(namespace+'title').text
if not is_yuho(title): continue**

updated = el.find(namespace+'updated').text if not time_check(updated,since): return yuho_dict # zipファイルのアドレスを辞書オブジェクトへ登録 _id = el.find(namespace+'id').text link = el.find('./'+namespace+'link[@type="application/zip"]') url = link.attrib['href'] cd = re.sub(r'^【(\w+)】.*',r"\1",title) yuho_dict[_id] = {'id':_id,'title':title,'cd':cd,'url':url,'update':updated} return yuho_dict

def is_yuho(title):
if u'有価証券報告書' in str(title):
return True
else:
return False

def time_check(update,since):
updated_time = dt.strptime(update, '%Y-%m-%dT%H:%M:%S+09:00')
return updated_time>=since

def make_directory(dir_name):
if not os.path.exists(dir_name):
os.mkdir(dir_name)

def write_download_info(ofname,info_dict):
with open(ofname,'w') as of:
json.dump(info_dict, of, indent=4)

def multi_controller(since):
p = 0
jobs = []
while(p < proc):
job = multiprocessing.Process(target=craete_xbrl_url_json, args=(since,p,))
jobs.append(job)
job.start()
p += 1
[job.join() for job in jobs]

def craete_xbrl_url_json(since,p):
#有報キャッチャーWebServiceのAtomAPIアドレスhttp://resource.ufocatch.com/
base_url = 'http://resource.ufocatch.com/atom/edinetx/query/'
namespace = '{http://www.w3.org/2005/Atom}'
#有報キャッチャーのページ
page = 1 + p
count = 0

while True: #文字列変換 t_symbol = str(page) print('page:'+t_symbol + ', loading...') #企業毎の有報へのデータへのリンク情報を取得 response_string = get_link_info_str(t_symbol, base_url) #xmlをparseするElementTreeを取得 ET_tree = ET.fromstring( response_string ) ET.register_namespace('',namespace[1:-1]) #downloadファイルの対象を取得 info_dict = get_link(ET_tree,namespace,since) count += len(info_dict) if len(info_dict) == 0 : #取得データがなくなり次第、処理終了 print('process' + str(p) + ':complete a download!! [' + str(count) + ']') break #Request用のJson形式のファイルを作成 json_directory=os.getcwd()+'/downloaded_info' make_directory(json_directory) ofname = json_directory+'/dat_download_'+t_symbol+'.json' write_download_info(ofname,info_dict) page += proc

if name=='main':
#TODO 取得データの末尾(以下例では、2010/04/01以降のデータを取得)
since = dt.strptime('2010-04-01','%Y-%m-%d')
print('since:', since)
#一定期間に発生したデータ全てのURLを取得する
multi_controller(since)

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

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

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

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

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

guest

回答2

0

if文の条件を追加したら想定通りに動きました。
ご回答誠にありがとうございました。

def is_yuho(title):

if u'有価証券報告書' in str(title)
and u'内国投資信託受益証券' in str(title) :
return True
else:
return False

投稿2018/05/14 07:50

fantasista959

総合スコア12

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

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

set0gut1

2018/05/14 07:55

おめでとうございます!
guest

0

ベストアンサー

python

1def is_target(title): 2 return '有価証券報告書' in title and not '内国投資信託受益証券' in title 3 4is_target("有価証券報告書(内国投資信託受益証券)") # False 5is_target("有価証券報告書(foofoofoo)") # True 6is_target("barbarbar(内国投資信託受益証券)") # False

こういう感じでしょうか。
もし違ったらコメントでご指摘ください。

投稿2018/05/11 20:34

set0gut1

総合スコア2413

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問