###前提・実現したいこと
PHPerです。
python3.5,Django1.10を使ってプログラムを書いています。
qiita.com/NaoyaOura/items/4f613525063d0c8d6653
のコードをDJangoのmanage.pyのコマンドとして叩けるようにしたいのですが、以下の様なエラーが発生して、10時間ぐらい悩んだのですが、解決策が思いつきません。
初めてのpythonで初めてのDjangoなので、優しくしてくれると嬉しいです。。。
###発生している問題・エラーメッセージ
Traceback (most recent call last): File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap self.run() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 114, in run self._target(*self._args, **self._kwargs) File "/Users/k-okina/Documents/misocks-api-py/cron/companies/step1.py", line 83, in craete_xbrl_url_json ET_tree = ET.fromstring( response_string ) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1300, in XML parser.feed(text) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1640, in feed self._parser.Parse(data, 0) UnicodeEncodeError: 'ascii' codec can't encode characters in position 92-99: ordinal not in range(128)
###該当のソースコード
project/cron/management/commands/getCompaniesUrl.py
python
1# -*- coding: utf-8 -*- 2from django.core.management.base import BaseCommand 3import requests 4import xml.etree.ElementTree as ET 5import json 6import os 7import io 8import re 9import sys 10import multiprocessing 11from collections import defaultdict 12from datetime import datetime as dt 13from cron.companies import step1 14 15class Command(BaseCommand): 16 17 def handle(self, *args, **options): 18 step1.handle()
project/cron/companies/step1.py
python
1# -*- coding: utf-8 -*- 2import requests 3import xml.etree.ElementTree as ET 4import json 5import os 6import io 7import re 8import multiprocessing 9from collections import defaultdict 10from datetime import datetime as dt 11 12proc = 4 # マルチプロセス制御 13 14def get_link_info_str(ticker_symbol, base_url): 15 url = base_url+ticker_symbol 16 response = requests.get(url) 17 return response.text 18 19def get_link(tree, namespace, since): 20 yuho_dict = defaultdict(dict) 21 #entryタグ毎にforeach 22 for el in tree.findall('.//'+namespace+'entry'): 23 24 #titleタグに有価証券の文字があれば、後続処理を実行 25 title = el.find(namespace+'title').text 26 if not is_yuho(title): continue 27 28 updated = el.find(namespace+'updated').text 29 if not time_check(updated,since): return yuho_dict 30 31 # zipファイルのアドレスを辞書オブジェクトへ登録 32 _id = el.find(namespace+'id').text 33 link = el.find('./'+namespace+'link[@type="application/zip"]') 34 url = link.attrib['href'] 35 cd = re.sub(r'^【(\w+)】.*',r"\1",title) 36 yuho_dict[_id] = {'id':_id,'title':title,'cd':cd,'url':url,'update':updated} 37 return yuho_dict 38 39def is_yuho(title): 40 if u'有価証券報告書' in str(title): 41 return True 42 else: 43 return False 44 45def time_check(update,since): 46 updated_time = dt.strptime(update, '%Y-%m-%dT%H:%M:%S+09:00') 47 return updated_time>=since 48 49def make_directory(dir_name): 50 if not os.path.exists(dir_name): 51 os.mkdir(dir_name) 52 53def write_download_info(ofname,info_dict): 54 with open(ofname,'w') as of: 55 json.dump(info_dict, of, indent=4) 56 57def multi_controller(since): 58 p = 0 59 jobs = [] 60 while(p < proc): 61 job = multiprocessing.Process(target=craete_xbrl_url_json, args=(since,p,)) 62 jobs.append(job) 63 job.start() 64 p += 1 65 [job.join() for job in jobs] 66 67def craete_xbrl_url_json(since,p): 68 #有報キャッチャーWebServiceのAtomAPIアドレス<http://resource.ufocatch.com/> 69 base_url = 'http://resource.ufocatch.com/atom/edinetx/query/' 70 namespace = '{http://www.w3.org/2005/Atom}' 71 #有報キャッチャーのページ 72 page = 1 + p 73 count = 0 74 75 while True: 76 #文字列変換 77 t_symbol = str(page) 78 print('page:'+t_symbol + ', loading...') 79 80 #企業毎の有報へのデータへのリンク情報を取得 81 response_string = get_link_info_str(t_symbol, base_url) 82 #xmlをparseするElementTreeを取得 83 ET_tree = ET.fromstring( response_string ) 84 ET.register_namespace('',namespace[1:-1]) 85 86 #downloadファイルの対象を取得 87 info_dict = get_link(ET_tree,namespace,since) 88 count += len(info_dict) 89 if len(info_dict) == 0 : 90 #取得データがなくなり次第、処理終了 91 print('process' + str(p) + ':complete a download!! [' + str(count) + ']') 92 break 93 94 #Request用のJson形式のファイルを作成 95 json_directory=os.getcwd()+'/downloaded_info' 96 make_directory(json_directory) 97 ofname = json_directory+'/dat_download_'+t_symbol+'.json' 98 write_download_info(ofname,info_dict) 99 100 page += proc 101 102def handle(): 103 #TODO 取得データの末尾(以下例では、2015/07/17以降のデータを取得) 104 since = dt.strptime('2015-07-17','%Y-%m-%d') 105 print('since:', since) 106 #一定期間に発生したデータ全てのURLを取得する 107 multi_controller(since)
###一言
どうにかして解決したいのですが、1人の力じゃあ無理でした。。。
本当に困っています。。。
どうか、お願いします。。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/25 13:18