1221 lines
47 KiB
Python
Executable file
1221 lines
47 KiB
Python
Executable file
#!/usr/bin/python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
from datetime import *
|
||
|
||
import calendar
|
||
import re
|
||
import urllib
|
||
|
||
import spynner
|
||
|
||
from pyquery import PyQuery
|
||
|
||
user_agent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36"
|
||
browser = spynner.Browser(
|
||
#debug_level=spynner.WARNING,
|
||
#debug_level=spynner.ERROR,
|
||
# debug_level=spynner.DEBUG,
|
||
#debug_level=spynner.INFO,
|
||
|
||
# user_agent = user_agent,
|
||
)
|
||
SESSION = False
|
||
|
||
|
||
def remove_space(s):
|
||
return s.replace(u' ','').strip()
|
||
|
||
def minguo2ce(minguo):
|
||
pattern = '(\d+)\.([ 0-9]{1,2})\.([ 0-9]{1,2})'
|
||
s = re.search(pattern, minguo)
|
||
if s:
|
||
yy = int(s.group(1))+1911
|
||
|
||
try:
|
||
mm = int(s.group(2))
|
||
except:
|
||
mm = 1
|
||
|
||
try:
|
||
dd = int(s.group(3))
|
||
except:
|
||
dd = 1
|
||
|
||
return date( yy, mm , dd )
|
||
|
||
pattern = '(\d+)/([ 0-9]{1,2})/([ 0-9]{1,2})'
|
||
s = re.search(pattern, minguo)
|
||
if s:
|
||
yy = int(s.group(1))+1911
|
||
|
||
try:
|
||
mm = int(s.group(2))
|
||
except:
|
||
mm = 1
|
||
|
||
try:
|
||
dd = int(s.group(3))
|
||
except:
|
||
dd = 1
|
||
|
||
return date( yy, mm , dd )
|
||
|
||
return
|
||
|
||
def Login():
|
||
global SESSION
|
||
|
||
if SESSION:
|
||
return SESSION
|
||
|
||
# timeout when loading images
|
||
try:
|
||
browser.load("http://portal.ntuh.gov.tw/General/Login.aspx")
|
||
except:
|
||
pass
|
||
# print browser.html.encode('utf8')
|
||
# exit()
|
||
|
||
# f = open('/tmp/workfile.txt', 'w')
|
||
# print >>f, browser.html.encode('utf8')
|
||
# f.close()
|
||
# exit()
|
||
|
||
browser.wk_fill("input[name=txtUserID]", "004552")
|
||
browser.wk_fill("input[name=txtPass]", "n122119493")
|
||
browser.click("input[id=rdblQuickMenu_0]")
|
||
browser.click("input[name=imgBtnSubmitNew]")
|
||
browser.wait_load()
|
||
|
||
pattern = "SESSION=(\w*)"
|
||
matches = re.findall('SESSION=(\w*)', browser.html)
|
||
SESSION = matches[0]
|
||
return SESSION
|
||
|
||
|
||
#病歷號/身分證號
|
||
def ReportPathology(ID, SESSION=Login()):
|
||
browser = spynner.Browser()
|
||
# browser = spynner.Browser(debug_level=spynner.DEBUG)
|
||
|
||
url = 'http://ihisaw.ntuh.gov.tw/WebApplication/ElectronicMedicalReportViewer/MobileMasterPage.aspx?SESSION=%s' % SESSION
|
||
# print url
|
||
browser.load(url)
|
||
# print browser.url, len(browser.html)
|
||
browser.wk_fill("#txbIDInput", str(ID))
|
||
browser.wk_click("#btnQueryAction")
|
||
browser.wait_load(timeout=30)
|
||
|
||
#print browser.url, len(browser.html)
|
||
|
||
matches0 = re.findall('<tr(.*?)</tr>', browser.html, re.DOTALL)
|
||
|
||
SingleMedicalReport = []
|
||
|
||
for m0 in matches0:
|
||
if m0.encode('utf-8').find('病理報告')!=-1:
|
||
if m0.find('>*<') != -1:
|
||
# skip records w/o report date
|
||
continue
|
||
matches = re.findall('<a id="(.*?)"', m0)
|
||
# print matches[0]
|
||
browser.click("a[id=%s]"%matches[0])
|
||
browser.wait_load()
|
||
m_iframe = re.findall('<iframe id="Reportifrm" name="Reportifrm" scrolling="auto" frameborder="0" src="(.*?)"', browser.html)
|
||
SingleMedicalReport.append(m_iframe[0].replace('amp;', ''))
|
||
browser.click("input[name=backToHome]")
|
||
browser.wait_load()
|
||
|
||
|
||
report = []
|
||
for r in SingleMedicalReport:
|
||
browser.load(r)
|
||
if browser.html.find('lblReportDate') == -1:
|
||
continue
|
||
|
||
matches = re.findall('ChartNo=(.*?)&ReportKey=(.*?)&ReportCode=(.*?)&PersonID=(.*?)$', browser.url)
|
||
|
||
ChartNo = matches[0][0]
|
||
ReportKey = matches[0][1]
|
||
ReportCode = matches[0][2]
|
||
PersonID = matches[0][3]
|
||
|
||
PathCode = re.findall('lblPathCode">(.*?)</span>', browser.html)[0]
|
||
SpecimenGetDate = re.findall('lblSpecimenGetDate">(.*?)</span>', browser.html)[0]
|
||
ReportDate = re.findall('lblReportDate">(.*?)</span>', browser.html)[0]
|
||
|
||
SpecimenCode = re.findall('lblSpecimenCode">(.*?)</span>', browser.html)[0]
|
||
DepCode = re.findall('lblDepCode">(.*?)</span>', browser.html)[0]
|
||
WardNoRoomCoBedNo = re.findall('lblWardNoRoomCoBedNo">(.*?)</span>', browser.html)[0]
|
||
Result = re.findall('lblResult">(.*?)<', browser.html)[0]
|
||
|
||
report.append({'url': browser.url,
|
||
'html': browser.html,
|
||
'ChartNo': ChartNo,
|
||
'ReportKey': ReportKey,
|
||
'ReportCode': ReportCode,
|
||
'PersonID': PersonID,
|
||
'PathCode': PathCode,
|
||
'SpecimenGetDate': SpecimenGetDate,
|
||
'ReportDate': ReportDate,
|
||
|
||
'SpecimenCode': SpecimenCode,
|
||
'DepCode': DepCode,
|
||
'WardNoRoomCoBedNo': WardNoRoomCoBedNo,
|
||
'Result': Result,
|
||
})
|
||
|
||
return report
|
||
|
||
|
||
def GetPatientList(ID, year, month, SESSION=Login()):
|
||
weakday, number = calendar.monthrange(year, month)
|
||
|
||
year = str(year)
|
||
month = str(month)
|
||
number = str(number)
|
||
|
||
browser.load('http://ihisaw.ntuh.gov.tw/WebApplication/InPatient/Ward/OpenWard.aspx?SESSION=%s' % SESSION)
|
||
browser.fill('input[id=NTUHWeb1_QueryInPatientPersonAccountControl1_IDInputTextBox]', ID)
|
||
|
||
browser.fill('input[id=NTUHWeb1_QueryInPatientPersonAccountControl1_DateTextBoxYearMonthDayInputUI1_YearInput]', year)
|
||
browser.fill('input[id=NTUHWeb1_QueryInPatientPersonAccountControl1_DateTextBoxYearMonthDayInputUI1_MonthInput]', month)
|
||
browser.fill('input[id=NTUHWeb1_QueryInPatientPersonAccountControl1_DateTextBoxYearMonthDayInputUI1_DayInput]', '1')
|
||
|
||
browser.fill('input[id=NTUHWeb1_QueryInPatientPersonAccountControl1_DateTextBoxYearMonthDayInputUI2_YearInput]', year)
|
||
browser.fill('input[id=NTUHWeb1_QueryInPatientPersonAccountControl1_DateTextBoxYearMonthDayInputUI2_MonthInput]', month)
|
||
browser.fill('input[id=NTUHWeb1_QueryInPatientPersonAccountControl1_DateTextBoxYearMonthDayInputUI2_DayInput]', number)
|
||
|
||
browser.click("input[id=NTUHWeb1_QueryInPatientPersonAccountControl1_EmpNoCareQueryButton]")
|
||
browser.wait_load()
|
||
|
||
# print browser.html
|
||
|
||
matches0 = re.findall('<tr(.*?)</tr>', browser.html, re.DOTALL)
|
||
|
||
PatientList = []
|
||
|
||
pattern = u'''
|
||
_WardLabel">(.*?)</span>
|
||
(.*?)_RoomLabel">(.*?)</span>
|
||
(.*?)_BedLabel">(.*?)</span>
|
||
(.*?)_LinkPatientName" title="(.*?)"
|
||
(.*?)_PatChartNo">(.*?)</span>
|
||
(.*?)_PatientSex">(.*?)</span>
|
||
(.*?)_PatientAge" title="生日:(.*?)">(.*?)</span>
|
||
(.*?)"住院總天數:(.*?)天">(.*?)</span>
|
||
'''
|
||
pattern = pattern.replace('"', '\\"')
|
||
pattern = pattern.replace('\n', '')
|
||
|
||
for m0 in matches0:
|
||
matches = re.findall(pattern, m0, re.DOTALL)
|
||
if matches:
|
||
# print matches
|
||
Pat = {}
|
||
Pat['Ward'] = remove_space(matches[0][0])
|
||
Pat['Room'] = remove_space(matches[0][2])
|
||
Pat['Bed'] = remove_space(matches[0][4])
|
||
Pat['Name'] = remove_space(matches[0][6])
|
||
Pat['ChartNo'] = remove_space(matches[0][8])
|
||
Pat['Sex'] = remove_space(matches[0][10])
|
||
Pat['Birthday'] = remove_space(matches[0][12]).replace('_', '-')
|
||
Pat['Age'] = remove_space(matches[0][13])
|
||
Pat['HospitalDays']= remove_space(matches[0][15])
|
||
Pat['Enter'] = remove_space(matches[0][16]).replace('/', '-')
|
||
# print Pat
|
||
|
||
PatientList.append(Pat)
|
||
|
||
return PatientList
|
||
|
||
|
||
'''
|
||
<select name="NTUHWeb1$QueryInPatientPersonAccountControl1$DropListWard" onchange="javascript:setTimeout('__doPostBack(\'NTUHWeb1$QueryInPatientPersonAccountControl1$DropListWard\',\'\')', 0)" id="NTUHWeb1_QueryInPatientPersonAccountControl1_DropListWard" class="normalText">
|
||
<input type="submit" name="NTUHWeb1$QueryInPatientPersonAccountControl1$QueryAccountNoByWardInput" value="病床查詢" id="NTUHWeb1_QueryInPatientPersonAccountControl1_QueryAccountNoByWardInput" accesskey="S" class="button" style="font-weight:bold;">
|
||
'''
|
||
def QueryAccountNoByWardInput(Ward, SESSION = Login()):
|
||
|
||
# print Ward
|
||
#
|
||
# import codecs, locale, sys
|
||
# import time
|
||
|
||
# browser.load('http://ihisaw.ntuh.gov.tw/WebApplication/InPatient/Ward/OpenWard.aspx?SESSION=%s' % SESSION, 1, wait_callback=wait_load)
|
||
browser.load('http://ihisaw.ntuh.gov.tw/WebApplication/InPatient/Ward/OpenWard.aspx?SESSION=%s' % SESSION)
|
||
ret = browser.load_jquery(True)
|
||
|
||
browser.select('#NTUHWeb1_QueryInPatientPersonAccountControl1_DropListWard option[value="%s"]'% Ward)
|
||
# browser.runjs("$('#NTUHWeb1_QueryInPatientPersonAccountControl1_DropListWard select').val('04A2').trigger('change');")
|
||
|
||
browser.click('#NTUHWeb1_QueryInPatientPersonAccountControl1_CheckBoxShowDrMainColumn',wait_load=True)
|
||
|
||
if 'LinkConfirmDiagnosisOrder' in browser.html:
|
||
browser.click('#NTUHWeb1_QueryInPatientPersonAccountControl1_CheckBoxShowDrMainColumn',wait_load=True)
|
||
|
||
# browser.browse()
|
||
|
||
## browser.fill('select[name=NTUHWeb1$QueryInPatientPersonAccountControl1$DropListWard]', Ward)
|
||
# print 1
|
||
## browser.wait_load(timeout = 9)
|
||
# browser.click_ajax("input[name=NTUHWeb1$QueryInPatientPersonAccountControl1$QueryAccountNoByWardInput]")
|
||
## print 2
|
||
## browser.wait_load()
|
||
|
||
# sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
|
||
# print browser.html
|
||
# exit()
|
||
|
||
d = PyQuery(browser.html)
|
||
ret = []
|
||
for tr in d('tr'):
|
||
tr = PyQuery(tr)
|
||
class1 = tr.attr['class']
|
||
if class1 in ['tableText', 'tableText2']:
|
||
r = {}
|
||
for td in tr('td'):
|
||
|
||
span = PyQuery(td)('span')
|
||
a = PyQuery(td)('a')
|
||
|
||
if span.attr['id']:
|
||
k = span.attr['id'].split('_')[-1]
|
||
v = span.text()
|
||
r[k] = v
|
||
|
||
if a.attr['id']:
|
||
k = a.attr['id'].split('_')[-1]
|
||
v = a.text()
|
||
r[k] = v
|
||
|
||
if span.attr['title']:
|
||
if len(span.attr['title'].split(':')) > 1:
|
||
k = span.attr['title'].split(':')[0].strip()
|
||
v = span.attr['title'].split(':')[1].strip()
|
||
else:
|
||
k = span.attr['id'].split('_')[-1]+'Title'
|
||
v = span.attr['title']
|
||
r[k] = v
|
||
|
||
# print r
|
||
r['LinkPatientName'] = r['LinkPatientName'].replace(u'[禁]', '').strip()
|
||
# print r['LinkPatientName']
|
||
# print class1
|
||
# print tr.text()
|
||
|
||
ret.append(r)
|
||
|
||
return ret
|
||
|
||
|
||
|
||
|
||
|
||
def get_dischargenotelist(html):
|
||
import urllib
|
||
import urllib2
|
||
|
||
'''
|
||
<form name="dischargenotelist" action="http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/SimpleInfoShowUsingPlaceHolder.aspx?SESSION=7326382368C5409597FFF02670E79E7E" target="dischargenote" method="post"><input type="hidden" name="KeyCodeList" value="12T01517135|12T07674504"><input type="hidden" name="KeyNameList" value="外_2012/06/05|復_2012/01/03"><input type="hidden" name="AccountIDSE" value="12T01517135"><input type="hidden" name="Func" value="DischargeSummary"></form>
|
||
'''
|
||
|
||
form = re.findall('<form(.*?)</form>', html)[0]
|
||
|
||
url = re.findall('action=\\"(.*?)\\"', form)[0]
|
||
|
||
q = {}
|
||
inputs = re.findall('<input(.*?)name=\\"(.*?)\\" value=\\"(.*?)\\"', form)
|
||
for input in inputs:
|
||
q[input[1]] = input[2].encode('utf-8')
|
||
|
||
data = urllib.urlencode(q)
|
||
results = urllib.urlopen(url, data)
|
||
|
||
content = results.read()
|
||
encoding=results.headers['content-type'].split('charset=')[-1]
|
||
ucontent = unicode(content, encoding)
|
||
|
||
|
||
q['HTML'] = ucontent
|
||
return q
|
||
|
||
|
||
def ShowDischargeNote(ID, SESSION=Login()):
|
||
# browser.debug_level = spynner.INFO
|
||
browser.load('http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/PatientMedicalRecordListQuery.aspx?QueryBySelf=N&SESSION=%s' % SESSION)
|
||
# print browser.html
|
||
browser.fill('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl01"]', ID)
|
||
browser.click('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl09"]')
|
||
browser.wait_load()
|
||
|
||
# print browser.html
|
||
matches0 = re.findall('<tr(.*?)</tr>', browser.html, re.DOTALL)
|
||
|
||
|
||
pattern = u'''
|
||
_InLabelHospName">(.*?)</span>
|
||
(.*?)_InLabelDeptName">(.*?)</span>
|
||
(.*?)_InLabelInDate">(.*?)</span>
|
||
(.*?)_InLabelOutDate">(.*?)</span>
|
||
(.*?)_InLabelWardName">(.*?)</span>
|
||
(.*?)_InLabelRoomName">(.*?)</span>
|
||
(.*?)_InLabelBedName">(.*?)</span>
|
||
(.*?)_InLabelMainDrName">(.*?)</span>
|
||
(.*?)_InLabelMainDiagnosisName">(.*?)</span>
|
||
(.*?)_InLabelStatusName">(.*?)</span>
|
||
(.*?)<input type="submit" (.*?) value="摘"
|
||
'''
|
||
|
||
'''
|
||
(.*?)<input type="submit" (.*?) value="摘" (id=".*?")
|
||
'''
|
||
|
||
pattern = pattern.replace('"', '\\"')
|
||
pattern = pattern.replace('\n', '')
|
||
|
||
SimpleInfoShowUsingPlaceHolder = []
|
||
|
||
for m0 in matches0:
|
||
# print m0
|
||
matches = re.findall(pattern, m0, re.DOTALL)
|
||
if matches:
|
||
In = {}
|
||
In['OutDate'] = remove_space(matches[0][6]).replace('/', '-')
|
||
if In['OutDate'] == '':
|
||
continue
|
||
|
||
In['HospName'] = remove_space(matches[0][0])
|
||
In['DeptName'] = remove_space(matches[0][2])
|
||
In['InDate'] = remove_space(matches[0][4]).replace('/', '-')
|
||
# In['OutDate'] = remove_space(matches[0][6])
|
||
In['WardName'] = remove_space(matches[0][8])
|
||
In['RoomName'] = remove_space(matches[0][10])
|
||
In['BedName'] = remove_space(matches[0][12])
|
||
In['MainDrName'] = remove_space(matches[0][14])
|
||
In['MainDiagnosisName'] = remove_space(matches[0][16])
|
||
In['StatusName'] = remove_space(matches[0][18])
|
||
In['ShowDischargeNote'] = remove_space(matches[0][20])
|
||
# In['ShowDischargeNote'] = remove_space(matches[0][21])
|
||
|
||
try:
|
||
# print browser.html
|
||
browser.click('input[%s]' % In['ShowDischargeNote'])
|
||
browser.wait_load()
|
||
except:
|
||
print "input[%s] ERROR!!!" % In['ShowDischargeNote']
|
||
browser.load('http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/PatientMedicalRecordListQuery.aspx?QueryBySelf=N&SESSION=%s' % SESSION)
|
||
browser.fill('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl01"]', ID)
|
||
browser.click('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl09"]')
|
||
browser.wait_load()
|
||
continue
|
||
|
||
q = get_dischargenotelist(browser.html)
|
||
|
||
In['AccountIDSE'] = q['AccountIDSE']
|
||
In['Func'] = q['Func']
|
||
In['KeyCodeList'] = q['KeyCodeList']
|
||
In['KeyNameList'] = q['KeyNameList']
|
||
In['HTML'] = q['HTML']
|
||
|
||
# print In['InDate'], In['OutDate']
|
||
|
||
SimpleInfoShowUsingPlaceHolder.append(In)
|
||
|
||
return SimpleInfoShowUsingPlaceHolder
|
||
|
||
def GetOutpatientByPhysician(name):
|
||
|
||
ret = []
|
||
|
||
# print 'x%sx'%name
|
||
# return
|
||
|
||
url = 'https://reg.ntuh.gov.tw/webadministration/DtQueryA.aspx'
|
||
browser.load(url)
|
||
# print browser.html
|
||
browser.wk_fill('input[name="DtName"]', name)
|
||
browser.click('input[name="QueryButton"]')
|
||
browser.wait_load()
|
||
|
||
# print browser.url
|
||
# print browser.html
|
||
|
||
'''
|
||
<td align="center" style="width:35px;"></td><td align="center" style="color:Red;width:80px;">停止掛號</td><td align="center" style="color:Green;width:70px;">住院醫師(代診不續掛)</td><td align="center" style="width:90px;">102.5.29<br>星期三 上午</td><td align="center" style="color:OrangeRed;width:70px;">總院區</td><td align="center" style="color:OrangeRed;width:70px;"></td><td style="width:90px;">外科部</td><td style="width:90px;">腦神經外科</td><td align="center">06</td><td align="center" style="width:50px;">105206</td><td align="center">不可</td><td align="center" style="color:Blue;width:120px;"></td><td style="color:Red;width:120px;">曾漢民 請假;住院醫師(代診不續掛) </td><td align="center"><a href="CurrentCondition.aspx?x=SQBEAD0AMQA1ADQAMAA5ADIANwAmAGwAYQBuAGcAPQBjAGgA0">查詢</a></td>
|
||
<td align="center" style="width:35px;"></td><td align="center" style="width:80px;">. <a href="RegistForm.aspx?x=RABlAHAAdAA9AFMAVQBSAEcAJgBIAG8AcwBwAD0AVAAwACYAQwBsAGkAbgBpAGMAQwBvAGQAZQA9ADAAMAAmAEMAbABpAG4AaQBjAE4AdQBtAD0AMQAwACYAQQBNAFAATQA9ADIAJgBTAHUAYgBEAGUAcAB0AD0AMAA3ACYARAB0AD0AMAAwADQANQA1ADIAJgBQAGgAbwBuAGkAYwBDAG8AZABlAD0AMgAwADUAMgAxADAAJgBEAGEAdABlAD0AMgAwADEAMwAvADUALwAzADEAJgBXAGUAZQBrAD0ANQAmAFMAcgB2AFQAeQBwAGUAPQAgAE8AMQAmAFMAcgB2AEkARAA9ADEANQA0ADIANAAyADcAJgB1AHMAZQBEAHIAUgBlAHMAdABDAG4AdAA9AG4A0" style="color:Blue;">掛號</a> .</td><td align="center" style="color:Green;width:70px;">蕭輔仁</td><td align="center" style="width:90px;">102.5.31<br>星期五 下午</td><td align="center" style="color:OrangeRed;width:70px;">總院區</td><td align="center" style="color:OrangeRed;width:70px;">西址-1樓</td><td style="width:90px;">外科部</td><td style="width:90px;">神經外科</td><td align="center">10</td><td align="center" style="width:50px;">205210</td><td align="center">可</td><td align="center" style="color:Blue;width:120px;"> 神經外科 </td><td></td><td></td>
|
||
<td align="center" style="width:35px;"></td><td align="center" style="color:Red;width:80px;">非有效掛號時段內</td><td align="center" style="color:Green;width:70px;">陳敞牧</td><td align="center" style="width:90px;">102.5.29<br>星期三 下午</td><td align="center" style="color:OrangeRed;width:70px;">總院區</td><td align="center" style="color:OrangeRed;width:70px;"></td><td style="width:90px;">外科部</td><td style="width:90px;">腦神經外科</td><td align="center">08</td><td align="center" style="color:Red;width:50px;">非有效時段內</td><td align="center">可</td><td align="center" style="color:Blue;width:120px;"></td><td></td><td align="center"><a href="CurrentCondition.aspx?x=SQBEAD0AMQA1ADQAMAA5ADIANQAmAGwAYQBuAGcAPQBjAGgA0">查詢</a></td>
|
||
'''
|
||
|
||
pattern = '<td align="center" style="width:35px;"></td><td(.*)>(.*)</td><td align="center" style="color:Green;width:70px;">(.*)</td><td align="center" style="width:90px;">(?P<date>.*)<br>(?P<ampm>.*)</td><td align="center" style="color:OrangeRed;width:70px;">(.*)</td><td align="center" style="color:OrangeRed;width:70px;">(.*)</td><td style="width:90px;">(?P<dept>.*)</td><td style="width:90px;">(.*)</td><td align="center">(?P<clinic>.*)</td><td(.*)">(.*)</td><td align="center">(.*)</td><td align="center" style="color:Blue;width:120px;">(.*)</td><td(.*)>(.*)</td><td(.*)>(.*)</td>'
|
||
pattern = pattern.replace('"', '\\"')
|
||
|
||
# matches = re.findall(pattern, browser.html)
|
||
# if not matches:
|
||
# exit()
|
||
# for m in matches:
|
||
# for mm in m:
|
||
# print mm,
|
||
# print
|
||
|
||
matches = [m.groupdict() for m in re.finditer(pattern, browser.html)]
|
||
for m in matches:
|
||
# print m['date'], m['ampm'], m['dept'], m['clinic']
|
||
ret.append({
|
||
'date': minguo2ce(m['date']),
|
||
'ampm': m['ampm'].split(' ')[1],
|
||
'dept': m['dept'],
|
||
'clinic': m['clinic'],
|
||
})
|
||
|
||
return ret
|
||
|
||
# exit()
|
||
|
||
#import pprint
|
||
#class MyPrettyPrinter(pprint.PrettyPrinter):
|
||
# def format(self, object, context, maxlevels, level):
|
||
# if isinstance(object, unicode):
|
||
# return (object.encode('utf8'), True, False)
|
||
# return pprint.PrettyPrinter.format(self, object, context, maxlevels, level)
|
||
|
||
|
||
def OpenClinicsPatientList(clinic, SESSION=Login()):
|
||
url = 'http://hisaw.ntuh.gov.tw/WebApplication/Clinics/OpenClinics.aspx?SESSION=%s' % SESSION
|
||
|
||
browser.load(url)
|
||
# browser.load_jquery(True)
|
||
|
||
|
||
OptionValue ={}
|
||
pattern = 'value="(?P<val>.*?)">(?P<text>.*?)</option>'
|
||
pattern = pattern.replace('"', '\\"')
|
||
matches = [m.groupdict() for m in re.finditer(pattern, browser.html)]
|
||
for m in matches:
|
||
t = m['text'].strip()
|
||
v = m['val'].strip()
|
||
if t != v:
|
||
OptionValue[t] = v
|
||
|
||
# for o in OptionValue:
|
||
# print o, OptionValue[o]
|
||
# exit()
|
||
|
||
browser.wk_select('#NTUHWeb1_DeptDropList', OptionValue[clinic['dept']])
|
||
|
||
browser.wk_fill('input[name="NTUHWeb1$DateTextBoxYearMonthDayInputUI1$YearInput"]', str(clinic['date'].year))
|
||
browser.wk_fill('input[name="NTUHWeb1$DateTextBoxYearMonthDayInputUI1$MonthInput"]', str(clinic['date'].month))
|
||
browser.wk_fill('input[name="NTUHWeb1$DateTextBoxYearMonthDayInputUI1$DayInput"]', str(clinic['date'].day))
|
||
|
||
browser.wk_select('#NTUHWeb1_AMPMDropList', OptionValue[clinic['ampm']])
|
||
browser.wk_fill('input[name="NTUHWeb1$ClinicNoInput"]', clinic['clinic'])
|
||
browser.wk_click('input[name="NTUHWeb1$QueryScheduleList"]', wait_load=True, timeout=9)
|
||
|
||
# MyPrettyPrinter().pprint(clinic)
|
||
try:
|
||
browser.wk_click('input[name="NTUHWeb1$CheckBoxAllPatient"]', wait_load=True, timeout=9)
|
||
except:
|
||
return None
|
||
|
||
# browser.wait_load()
|
||
# browser.submit("input[name=NTUHWeb1$QueryScheduleList]")
|
||
|
||
# print browser.html
|
||
|
||
pattern = 'VisitSeqnoPlusName" value="(?P<SeqnoPlusName>.*?)"'
|
||
pattern = pattern.replace('"', '\\"')
|
||
matches = [m.groupdict() for m in re.finditer(pattern, browser.html)]
|
||
|
||
PatientList = []
|
||
|
||
for m in matches:
|
||
seq, name = m['SeqnoPlusName'].split(' ')
|
||
name2 = name.split('【')[0]
|
||
# print seq, name, name2
|
||
PatientList.append((name2, clinic['physician']))
|
||
|
||
# print PatientList
|
||
return PatientList
|
||
|
||
|
||
def PACSImageShowList(PersonID, SESSION = Login()):
|
||
'''
|
||
Show list of PACS Image
|
||
'''
|
||
|
||
# url = "http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/PACSImageShowList.aspx?SESSION=%s&PatClass=I&AccountIDSE=10T01921636&PersonID=%s&Hosp=T0&Seed=20100915175850&EMRPop=Y" % (SESSION,PersonID)
|
||
url = "http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/PACSImageShowList.aspx?SESSION=%s&PatClass=I&PersonID=%s&Hosp=T0&EMRPop=Y" % (SESSION,PersonID)
|
||
# print url
|
||
response = browser.load(url)
|
||
body = browser.html
|
||
|
||
|
||
'''
|
||
<input id="BloodCallRecordDataGrid_ctl02_CheckboxSelect" type="checkbox" name="BloodCallRecordDataGrid$ctl02$CheckboxSelect">
|
||
</td><td>
|
||
<span id="BloodCallRecordDataGrid_ctl02_PatChartNo">5656063</span>
|
||
</td><td align="left">
|
||
<span id="BloodCallRecordDataGrid_ctl02_RequestSheetNo">T0122861905</span>
|
||
</td><td align="left">
|
||
<span id="BloodCallRecordDataGrid_ctl02_ExamDate">20120425</span>
|
||
</td><td align="left">
|
||
<a id="BloodCallRecordDataGrid_ctl02_LinkOrderNameNew" href="javascript:__doPostBack('BloodCallRecordDataGrid$ctl02$LinkOrderNameNew','')" style="color:Black;">MRI With/Without Contrast--Brain</a>
|
||
<input type="hidden" name="BloodCallRecordDataGrid$ctl02$HdnNewImage" id="BloodCallRecordDataGrid_ctl02_HdnNewImage" value="True">
|
||
<input type="hidden" name="BloodCallRecordDataGrid$ctl02$HdnOldImage" id="BloodCallRecordDataGrid_ctl02_HdnOldImage" value="False">
|
||
</td><td align="left">
|
||
|
||
</td><td align="left">
|
||
<span id="BloodCallRecordDataGrid_ctl02_Modality">MR</span>
|
||
</td><td align="left">
|
||
<span id="BloodCallRecordDataGrid_ctl02_VerifiedStateString">已確認</span>
|
||
</td>
|
||
'''
|
||
|
||
pattern='''
|
||
<span id="(.*?)_PatChartNo">(?P<PatChartNo>.*?)</span>
|
||
</td><td align="left">
|
||
<span id="(.*?)_RequestSheetNo">(?P<RequestSheetNo>.*?)</span>
|
||
</td><td align="left">
|
||
<span id="(.*?)_ExamDate">(?P<ExamDate>.*?)</span>
|
||
</td><td align="left">
|
||
<a id="BloodCallRecordDataGrid(.*?)Black;">(?P<LinkOrderName>.*?)</a>
|
||
(.*?)
|
||
<span id="(.*?)_Modality">(?P<Modality>.*?)</span>
|
||
</td><td align="left">
|
||
<span id="(.*?)_VerifiedStateString">(?P<VerifiedStateString>.*?)</span>
|
||
'''
|
||
pattern = pattern.replace('"', '\\"')
|
||
pattern = pattern.replace('\n', '\\s*')
|
||
# matches = re.findall(pattern, body)
|
||
matches = [m.groupdict() for m in re.finditer(pattern, browser.html, re.DOTALL)]
|
||
|
||
results = []
|
||
for match in matches:
|
||
r = {}
|
||
r['PatChartNo'] = remove_space(match['PatChartNo'])
|
||
r['RequestSheetNo'] = remove_space(match['RequestSheetNo'])
|
||
r['ExamDate'] = remove_space(match['ExamDate'])
|
||
r['LinkOrderName'] = remove_space(match['LinkOrderName'])
|
||
r['Modality'] = remove_space(match['Modality'])
|
||
r['VerifiedStateString'] = remove_space(match['VerifiedStateString'])
|
||
results.append(r)
|
||
|
||
return results
|
||
|
||
|
||
#Excluded version
|
||
def PACSImageShowReport(ID, RequestSheetNoExcluded = [], Modality = ['CT', 'MR'],SESSION = None):
|
||
|
||
if SESSION is None:
|
||
SESSION = Login()
|
||
|
||
url = "http://ihisaw.ntuh.gov.tw/WebApplication/ElectronicMedicalReportViewer/MobileMasterPage.aspx?SESSION=%s" % SESSION
|
||
browser.load(url)
|
||
|
||
browser.wk_fill("input[name=txbIDInput]", ID)
|
||
browser.click_link("input[name=btnQueryAction]")
|
||
# browser.wait_load()
|
||
|
||
d = PyQuery(browser.html)
|
||
|
||
reportitems = []
|
||
|
||
d2 = d('div').filter(lambda i: PyQuery(this).children('div').attr.reportgroup == u'影核醫')
|
||
|
||
for ri in d2('.reportitem'):
|
||
Included = False
|
||
for mod in Modality:
|
||
if mod in ri.find('td').text:
|
||
Included = True
|
||
break
|
||
|
||
if not Included:
|
||
# print '%s excluded'%ri.find('td').text.strip()
|
||
continue
|
||
|
||
for rsn in RequestSheetNoExcluded:
|
||
if rsn in ri.attrib['param']:
|
||
ri = None
|
||
break
|
||
if ri is not None:
|
||
# print ri.find('td').text.strip()
|
||
reportitems.append(ri)
|
||
|
||
# print reportitems
|
||
# exit()
|
||
|
||
urls = []
|
||
|
||
if reportitems:
|
||
ri0 = reportitems[0]
|
||
# link = "tr[id=%s]"%ri0.attrib['id']
|
||
link = "a[id=%s]"%ri0.attrib['id'].replace('itemHolder', 'lbnSelectPrintIEH')
|
||
|
||
# print link
|
||
browser.click_link(link)
|
||
d = PyQuery(browser.html)
|
||
|
||
url = d('#Reportifrm').attr['src']
|
||
|
||
# print ri0
|
||
# print url
|
||
|
||
# print (ri0.attrib['param'], ri.attrib['param'])
|
||
|
||
for ri in reportitems:
|
||
# print (ri0.attrib['param'], ri.attrib['param'])
|
||
urls.append(url.replace(ri0.attrib['param'], ri.attrib['param']))
|
||
|
||
# return urls
|
||
|
||
reports = []
|
||
|
||
for url in urls:
|
||
r = {}
|
||
browser.load(url)
|
||
if u'已發報告' in browser.html:
|
||
d = PyQuery(browser.html)
|
||
r['PatChartNo'] = d('div.patientInfo').find('td')[1].text
|
||
r['RequestSheetNo'] = d('td').filter(lambda i: PyQuery(this).children('span').attr.id is not None and 'AccessNo' in PyQuery(this).children('span').attr.id).text()
|
||
r['ExamDate'] = d('td').filter(lambda i: PyQuery(this).children('span').attr.id is not None and 'ExamDate' in PyQuery(this).children('span').attr.id).text()
|
||
r['LinkOrderName'] = d('td').filter(lambda i: PyQuery(this).children('span').attr.id is not None and 'OrderDesc' in PyQuery(this).children('span').attr.id).text()
|
||
r['Modality'] = r['LinkOrderName'][:2]
|
||
r['VerifiedStateString'] = d('td').filter(lambda i: PyQuery(this).children('span').attr.id is not None and 'Status' in PyQuery(this).children('span').attr.id).text()
|
||
r['Exam'] = d('span').filter(lambda i: PyQuery(this).attr.id is not None and PyQuery(this).attr.id.endswith('TitleExam')).parents('tr').nextAll().children('td')[0].text_content().strip()
|
||
r['Impression'] = d('span').filter(lambda i: PyQuery(this).attr.id is not None and 'TitleImpression' in PyQuery(this).attr.id).parents('tr').nextAll().children('td')[0].text_content().strip()
|
||
r['Report'] = browser.html
|
||
|
||
r['ExamDate'] = datetime.strptime(r['ExamDate'], "%Y/%m/%d")
|
||
|
||
reports.append(r)
|
||
|
||
print r['RequestSheetNo']
|
||
|
||
return reports
|
||
|
||
|
||
def ElectronicMedicalReportViewer(ID, ReportKeyExcluded = [], SESSION = None):
|
||
if SESSION is None:
|
||
SESSION = Login()
|
||
|
||
url = "http://ihisaw.ntuh.gov.tw/WebApplication/ElectronicMedicalReportViewer/MobileMasterPage.aspx?SESSION=%s" % SESSION
|
||
try:
|
||
browser.load(url)
|
||
except:
|
||
return []
|
||
|
||
browser.wk_fill("input[name=txbIDInput]", ID)
|
||
browser.click_link("input[name=btnQueryAction]")
|
||
# browser.wait_load()
|
||
|
||
d = PyQuery(browser.html)
|
||
|
||
ret1 = []
|
||
|
||
for groupHolder in d('div').filter(lambda i: PyQuery(this).attr.id is not None and PyQuery(this).attr.id.endswith('groupHolder')):
|
||
reportitems = []
|
||
d2 = PyQuery(groupHolder)
|
||
print d2.attr.id
|
||
for ri in d2('.reportitem'):
|
||
|
||
td = PyQuery(ri).children('td')
|
||
ReportClass = td[0].text.strip()
|
||
|
||
# CheckDate = td[1].text.strip()
|
||
# ReportDate = td[2].text.strip()
|
||
# print CheckDate, ReportDate
|
||
|
||
try:
|
||
CheckDate = datetime.strptime(td[1].text.strip(), "%Y/%m/%d").date()
|
||
except:
|
||
CheckDate = None
|
||
|
||
try:
|
||
ReportDate = datetime.strptime(td[2].text.strip(), "%Y/%m/%d").date()
|
||
except:
|
||
ReportDate = None
|
||
|
||
# print ReportClass, CheckDate, ReportDate
|
||
|
||
for rk in ReportKeyExcluded:
|
||
if rk in ri.attrib['param']:
|
||
ri = None
|
||
break
|
||
if ri is not None:
|
||
# print ri.find('td').text.strip()
|
||
reportitems.append((ri, ReportClass, CheckDate, ReportDate))
|
||
|
||
if reportitems:
|
||
ri0 = reportitems[0][0]
|
||
link = "a[id=%s]"%ri0.attrib['id'].replace('itemHolder', 'lbnSelectPrintIEH')
|
||
# print link
|
||
try:
|
||
browser.click_link(link, timeout=30)
|
||
d = PyQuery(browser.html)
|
||
url = d('#Reportifrm').attr['src']
|
||
browser.click_link("input[name=backToHome]")
|
||
except:
|
||
print 'timeout'
|
||
reportitems = []
|
||
url = "http://ihisaw.ntuh.gov.tw/WebApplication/ElectronicMedicalReportViewer/MobileMasterPage.aspx?SESSION=%s" % SESSION
|
||
browser.load(url, load_timeout=30)
|
||
browser.wk_fill("input[name=txbIDInput]", ID)
|
||
browser.click_link("input[name=btnQueryAction]")
|
||
|
||
for ri, ReportClass, CheckDate, ReportDate in reportitems:
|
||
# urls.append((url.replace(ri0.attrib['param'], ri.attrib['param']), ReportClass, CheckDate, ReportDate))
|
||
url2 = url.replace(ri0.attrib['param'], ri.attrib['param'])
|
||
# print url2
|
||
ret1.append({
|
||
'URL': url2,
|
||
'ReportClass': ReportClass,
|
||
'CheckDate': CheckDate,
|
||
'ReportDate': ReportDate,
|
||
})
|
||
|
||
|
||
# return urls
|
||
|
||
ret2 = []
|
||
for ret in ret1:
|
||
ReportKey = re.search(r'ReportKey=(.+)&ReportCode', ret['URL']).group(1)
|
||
ReportCode = re.search(r'ReportCode=(.+)&PersonID', ret['URL']).group(1)
|
||
# print ret['URL']
|
||
try: # avoid stop on timeout
|
||
browser.load(ret['URL'])
|
||
except:
|
||
continue
|
||
html = browser.html
|
||
# if u'未打報告' in html:
|
||
# continue
|
||
ret['ReportKey'] = ReportKey
|
||
ret['ReportCode'] = ReportCode
|
||
ret['Report'] = html
|
||
ret2.append(ret)
|
||
|
||
# print ret
|
||
# exit
|
||
|
||
|
||
# if len(reports) > 10: #debug with 10 reports maximum
|
||
# break
|
||
|
||
# print
|
||
return ret2
|
||
|
||
def PatientMedicalRecordList(Chart, KeyCodeExcluded = [], KeyNameExcluded = [], SESSION = Login()):
|
||
result ={}
|
||
|
||
url = "http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/PatientMedicalRecordListQuery.aspx?QueryBySelf=N&SESSION=%s" % SESSION
|
||
browser.load(url)
|
||
browser.wk_fill('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl01"]', Chart)
|
||
browser.click_link('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl09"]')
|
||
body = browser.html
|
||
|
||
pattern = r'<span id="NTUHWeb1_PatAccountListRecord1_PatBasicDescription" .*?>(?P<name>.*?)\((?P<gender>.*?),(?P<birthday>.*?),(?P<age>.*?)\) (?P<extra> .*?)? \((?P<branch>.*?)\)</span>'
|
||
r = re.compile(pattern)
|
||
# print r.findall(body)
|
||
d = [m.groupdict() for m in r.finditer(body)]
|
||
if d:
|
||
d[0]['Dead'] = None
|
||
if d[0]['extra']:
|
||
# print d[0]['extra']
|
||
matches = re.findall(ur'(..../../..) 已死亡', d[0]['extra'])
|
||
# print matches
|
||
if matches:
|
||
d[0]['Dead'] = matches[0]
|
||
# print d[0]
|
||
result.update(d[0])
|
||
else:
|
||
result['Dead'] = None
|
||
|
||
d = PyQuery(browser.html)
|
||
|
||
|
||
# 住
|
||
InPat = {}
|
||
Emergency = {}
|
||
OutPat = {}
|
||
|
||
InPatList = []
|
||
EmergencyList = []
|
||
OutPatList = []
|
||
|
||
# for record in d('input').filter(lambda i: PyQuery(this).attr.id is not None and PyQuery(this).attr.id.endswith('ShowDischargeNote')).parents('tr'):
|
||
for record in d('tr'):
|
||
ieo = {} #住門急
|
||
|
||
record = PyQuery(record)
|
||
if record.attr.onmouseover is None:
|
||
continue
|
||
|
||
for SpanLabel in PyQuery(record)('span'):
|
||
SpanLabel = PyQuery(SpanLabel)
|
||
# if SpanLabel.attr.id is None:
|
||
# continue
|
||
|
||
# print SpanLabel.attr.id
|
||
if 'GridViewInPatRecord' in SpanLabel.attr.id:
|
||
match = re.search(r'InLabel(.*)$', SpanLabel.attr.id)
|
||
key = match.group(1)
|
||
value = SpanLabel.text().strip()
|
||
if value:
|
||
ieo[key] = value
|
||
ieo['spanid'] = re.search(r'(.*)_(.*)', SpanLabel.attr.id).group(1)
|
||
if 'GridViewEmergencyContent' in SpanLabel.attr.id:
|
||
match = re.search(r'LabelEmer(.*)$', SpanLabel.attr.id)
|
||
key = match.group(1)
|
||
value = SpanLabel.text().strip()
|
||
if value:
|
||
ieo[key] = value
|
||
ieo['spanid'] = re.search(r'(.*)_(.*)', SpanLabel.attr.id).group(1)
|
||
if 'GridViewOutPatRecord' in SpanLabel.attr.id:
|
||
match = re.search(r'_Label(.*)$', SpanLabel.attr.id)
|
||
key = match.group(1)
|
||
value = SpanLabel.text().strip()
|
||
if value:
|
||
ieo[key] = value
|
||
ieo['spanid'] = re.search(r'(.*)_(.*)', SpanLabel.attr.id).group(1)
|
||
|
||
if 'GridViewInPatRecord' in ieo['spanid']:
|
||
KeyName = u'%s_%s'%(ieo['DeptName'], ieo['InDate'])
|
||
InPat[KeyName]= ieo
|
||
if KeyName not in KeyNameExcluded:
|
||
InPatList.append(KeyName)
|
||
if 'GridViewEmergencyContent' in ieo['spanid']:
|
||
KeyName = u'急%s_%s'%(ieo['DeptName'], ieo['ComeClinicDate'])
|
||
Emergency[KeyName]= ieo
|
||
if KeyName not in KeyNameExcluded:
|
||
EmergencyList.append(KeyName)
|
||
if 'GridViewOutPatRecord' in ieo['spanid']:
|
||
KeyName = u'%s_%s'%(ieo['DeptName'], ieo['ComeClinicDate'])
|
||
OutPat[KeyName]= ieo
|
||
if KeyName not in KeyNameExcluded:
|
||
OutPatList.append(KeyName)
|
||
|
||
browser2 = spynner.Browser()
|
||
if InPatList:
|
||
browser.click_link('input[id="%s_ShowDischargeNote"]'%InPat.itervalues().next()['spanid'])
|
||
df = PyQuery(browser.html)
|
||
form = df('form[name="dischargenotelist"]')
|
||
url = form.attr.action
|
||
data = {}
|
||
for input in form.children('input'):
|
||
input = PyQuery(input)
|
||
n = input.attr.name
|
||
v = input.attr.value
|
||
data[n] =v
|
||
for KeyCode, KeyName in zip(data['KeyCodeList'].split('|'), data['KeyNameList'].split('|')):
|
||
if KeyCode == '' or (KeyCode in KeyCodeExcluded):
|
||
continue
|
||
data2 = data
|
||
data2['AccountIDSE'] = KeyCode
|
||
data2['KeyCodeList'] = KeyCode
|
||
data2['KeyNameList'] = KeyName.encode('utf8')
|
||
print data2
|
||
posturl = '%s&%s' % (url, urllib.urlencode(data2))
|
||
try:
|
||
browser2.load(posturl)
|
||
except:
|
||
continue
|
||
InPat[KeyName]['KeyCode'] = KeyCode
|
||
InPat[KeyName]['Func'] = data2['Func']
|
||
InPat[KeyName]['DOC'] = browser2.html
|
||
if EmergencyList:
|
||
browser.click_link('input[id="%s_ShowEmergencyClinicHistory"]'%Emergency.itervalues().next()['spanid'])
|
||
df = PyQuery(browser.html)
|
||
form = df('form[name="emerrecordlist"]')
|
||
url = form.attr.action
|
||
data = {}
|
||
for input in form.children('input'):
|
||
input = PyQuery(input)
|
||
n = input.attr.name
|
||
v = input.attr.value
|
||
data[n] =v
|
||
for KeyCode, KeyName in zip(data['KeyCodeList'].split('|'), data['KeyNameList'].split('|')):
|
||
if KeyCode == '' or (KeyCode in KeyCodeExcluded):
|
||
continue
|
||
data2 = data
|
||
data2['AccountIDSE'] = KeyCode
|
||
data2['KeyCodeList'] = KeyCode
|
||
data2['KeyNameList'] = KeyName.encode('utf8')
|
||
print data2
|
||
posturl = '%s&%s' % (url, urllib.urlencode(data2))
|
||
try:
|
||
browser2.load(posturl)
|
||
except:
|
||
continue
|
||
Emergency[KeyName]['KeyCode'] = KeyCode
|
||
Emergency[KeyName]['Func'] = data2['Func']
|
||
Emergency[KeyName]['DOC'] = browser2.html
|
||
if OutPatList:
|
||
browser.click_link('input[id="%s_ShowMedicalRecord"]'%OutPat.itervalues().next()['spanid'])
|
||
df = PyQuery(browser.html)
|
||
form = df('form[name="dischargenotelist"]')
|
||
url = form.attr.action
|
||
data = {}
|
||
for input in form.children('input'):
|
||
input = PyQuery(input)
|
||
n = input.attr.name
|
||
v = input.attr.value
|
||
data[n] =v
|
||
for KeyCode, KeyName in zip(data['KeyCodeList'].split('|'), data['KeyNameList'].split('|')):
|
||
if KeyCode == '' or (KeyCode in KeyCodeExcluded):
|
||
continue
|
||
data2 = data
|
||
data2['AccountIDSE'] = KeyCode
|
||
data2['KeyCodeList'] = KeyCode
|
||
data2['KeyNameList'] = KeyName.encode('utf8')
|
||
print data2
|
||
posturl = '%s&%s' % (url, urllib.urlencode(data2))
|
||
try:
|
||
browser2.load(posturl)
|
||
except:
|
||
continue
|
||
OutPat[KeyName]['KeyCode'] = KeyCode
|
||
OutPat[KeyName]['Func'] = data2['Func']
|
||
OutPat[KeyName]['DOC'] = browser2.html
|
||
|
||
result['InPat'] = InPat
|
||
result['Emergency'] = Emergency
|
||
result['OutPat'] = OutPat
|
||
|
||
return result
|
||
|
||
|
||
### Old
|
||
#def PatientMedicalRecordListQuery(PersonID, SESSION = Login()):
|
||
def PatientMedicalRecordListQuery(Chart, SESSION = Login()):
|
||
'''
|
||
Show hospital visit
|
||
'''
|
||
|
||
# print PersonID
|
||
# print Chart
|
||
|
||
url = "http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/PatientMedicalRecordListQuery.aspx?QueryBySelf=N&SESSION=%s" % SESSION
|
||
browser.load(url)
|
||
browser.wk_fill('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl01"]', Chart)
|
||
browser.wk_click('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl09"]', wait_load=True, timeout=9)
|
||
body = browser.html
|
||
|
||
result = {}
|
||
|
||
#已死亡?
|
||
|
||
#<span id="NTUHWeb1_PatAccountListRecord1_PatBasicDescription" style="background-color:Azure;font-size:Larger;">丁美倫(F,1971/10/29,42y0m) (總院)</span>
|
||
#<span id="NTUHWeb1_PatAccountListRecord1_PatBasicDescription" style="background-color:Azure;font-size:Larger;">邵輝雄(M,1948/08/27,62y0m21d) 2010/09/17 已死亡 (總院)</span>
|
||
#<span id="NTUHWeb1_PatAccountListRecord1_PatBasicDescription" style="background-color:Azure;font-size:Larger;">郭德(M,1935/12/01,72y5m10d) 2008/05/11 已死亡 (總院)</span>
|
||
|
||
pattern = r'<span id="NTUHWeb1_PatAccountListRecord1_PatBasicDescription" .*?>(?P<name>.*?)\((?P<gender>.*?),(?P<birthday>.*?),(?P<age>.*?)\) (?P<extra> .*?)? \((?P<branch>.*?)\)</span>'
|
||
r = re.compile(pattern)
|
||
# print r.findall(body)
|
||
d = [m.groupdict() for m in r.finditer(body)]
|
||
if d:
|
||
d[0]['Dead'] = None
|
||
if d[0]['extra']:
|
||
# print d[0]['extra']
|
||
matches = re.findall(ur'(..../../..) 已死亡', d[0]['extra'])
|
||
# print matches
|
||
if matches:
|
||
d[0]['Dead'] = matches[0]
|
||
print d[0]
|
||
result.update(d[0])
|
||
else:
|
||
result['Dead'] = None
|
||
|
||
# pattern = '<span id="NTUHWeb1_PatAccountListRecord1_PatBasicDescription">(.*?)\\((.*?)\\)(.*?)</span>'
|
||
# matches = re.findall(pattern, body)
|
||
# try:
|
||
# match = matches[0]
|
||
# search = re.search('..../../..', match[2])
|
||
# result['Dead'] = datetime.datetime.strptime(search.group(0),'%Y/%m/%d')
|
||
# except:
|
||
# result['Dead'] = None
|
||
|
||
|
||
|
||
# match = matches[0]
|
||
# if match[2].find('已死亡') != -1:
|
||
# search = re.search('..../../..', match[2])
|
||
# result['Dead'] = search.group(0)
|
||
# else:
|
||
# result['Dead'] = None
|
||
|
||
# 住
|
||
pattern ='''
|
||
<span id=".*?_InLabelHospName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_InLabelDeptName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_InLabelInDate">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_InLabelOutDate">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_InLabelWardName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_InLabelRoomName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_InLabelBedName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_InLabelMainDrName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_InLabelMainDiagnosisName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_InLabelStatusName">(.*?)</span>
|
||
'''
|
||
pattern = pattern.replace('"', '\\"')
|
||
pattern = pattern.replace('\n', '\\s*?')
|
||
matches = re.findall(pattern, body)
|
||
In = []
|
||
for match in matches:
|
||
r = {}
|
||
r['HospName'] = remove_space(match[0])
|
||
r['DeptName'] = remove_space(match[1])
|
||
r['InDate'] = datetime.strptime(remove_space(match[2]),'%Y/%m/%d')
|
||
# r['OutDate'] = datetime.datetime.strptime(remove_space(match[3]),'%Y/%m/%d')
|
||
try:
|
||
r['OutDate'] = datetime.strptime(remove_space(match[3]),'%Y/%m/%d')
|
||
except:
|
||
r['OutDate'] = None
|
||
r['WardName'] = remove_space(match[4])
|
||
r['RoomName'] = remove_space(match[5])
|
||
r['BedName'] = remove_space(match[6])
|
||
r['MainDrName'] = remove_space(match[7])
|
||
r['MainDiagnosisName'] = remove_space(match[8])
|
||
r['StatusName'] = remove_space(match[9])
|
||
In.append(r)
|
||
result['In'] = In
|
||
|
||
# 急
|
||
pattern ='''
|
||
<span id=".*?_LabelEmerHospName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelEmerDeptName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelEmerComeClinicDate">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelEmerDischargeDate">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelEmerMainDrName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelEmerMainDiagnosisName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelEmerStatusName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelEmerTempBedID">(.*?)</span>
|
||
'''
|
||
pattern = pattern.replace('"', '\\"')
|
||
pattern = pattern.replace('\n', '\\s*?')
|
||
matches = re.findall(pattern, body)
|
||
Emer = []
|
||
for match in matches:
|
||
r = {}
|
||
r['HospName'] = remove_space(match[0])
|
||
r['DeptName'] = remove_space(match[1])
|
||
r['ComeClinicDate'] = datetime.strptime(remove_space(match[2]),'%Y/%m/%d')
|
||
try:
|
||
r['DischargeDate'] = datetime.strptime(remove_space(match[3]),'%Y/%m/%d')
|
||
except:
|
||
r['DischargeDate'] = None
|
||
r['MainDrName'] = remove_space(match[4])
|
||
r['MainDiagnosisName'] = remove_space(match[5])
|
||
r['StatusName'] = remove_space(match[6])
|
||
r['TempBedID'] = remove_space(match[7])
|
||
Emer.append(r)
|
||
result['Emer'] = Emer
|
||
|
||
# 門
|
||
pattern ='''
|
||
<span id=".*?_LabelHospName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelDeptName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelComeClinicDate">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelSpecialCureName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelMainDrName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelMainDiagnosisName">(.*?)</span>
|
||
.*?
|
||
<span id=".*?_LabelAccountStatusName">(.*?)</span>
|
||
'''
|
||
pattern = pattern.replace('"', '\\"')
|
||
pattern = pattern.replace('\n', '\\s*?')
|
||
matches = re.findall(pattern, body)
|
||
OutPat = []
|
||
for match in matches:
|
||
r = {}
|
||
r['HospName'] = remove_space(match[0])
|
||
r['DeptName'] = remove_space(match[1])
|
||
r['ComeClinicDate'] = datetime.strptime(remove_space(match[2]),'%Y/%m/%d')
|
||
r['SpecialCureName'] = remove_space(match[3])
|
||
r['MainDrName'] = remove_space(match[4])
|
||
r['MainDiagnosisName'] = remove_space(match[5])
|
||
r['AccountStatusName'] = remove_space(match[6])
|
||
OutPat.append(r)
|
||
result['OutPat'] = OutPat
|
||
|
||
return result
|
||
|
||
|
||
def ShowOperationList(Chart, KeyCodeExcluded = [], KeyNameExcluded = [], SESSION = Login()):
|
||
|
||
url = "http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/PatientMedicalRecordListQuery.aspx?QueryBySelf=N&SESSION=%s" % SESSION
|
||
browser.load(url)
|
||
browser.wk_fill('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl01"]', Chart)
|
||
browser.click_link('input[name="NTUHWeb1$PatientBasicInfoQueryByIDAndName1$ctl09"]')
|
||
browser.click_link('input[name="NTUHWeb1$PatAccountListRecord1$ShowOperationList"]')
|
||
|
||
match = re.search(r"'(http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/SimpleInfoShowUsingPlaceHolder.aspx.+?)'", browser.html)
|
||
if match is None:
|
||
return []
|
||
url = match.group(1)
|
||
# url = re.search(r"http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/SimpleInfoShowUsingPlaceHolder.aspx?SESSION=(.+)", browser.html).group(1)
|
||
|
||
browser.load(url)
|
||
body = browser.html
|
||
|
||
pattern ="'TreeViewItem','(.*?)'\)(.*?)>(.*?)</a>"
|
||
# pattern = 'name="KeyCodeList" value=(.*?)><input type=hidden name="KeyNameList" value=(.*?)>'
|
||
matches=re.findall(pattern, body)
|
||
|
||
KeyList = []
|
||
for m in matches:
|
||
KeyCode = m[0][1:]
|
||
KeyName = m[2]
|
||
|
||
if KeyCode in KeyCodeExcluded:
|
||
continue
|
||
|
||
if KeyName in KeyNameExcluded:
|
||
continue
|
||
|
||
KeyList.append((KeyCode, KeyName))
|
||
|
||
url = 'http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/SimpleInfoShowUsingPlaceHolder.aspx?SESSION=%s' % SESSION
|
||
|
||
ret = []
|
||
|
||
for KeyCode, KeyName in KeyList:
|
||
data = {
|
||
'KeyCodeList': KeyCode,
|
||
'KeyNameList': KeyName,
|
||
'Func' : 'OPNoteList',
|
||
}
|
||
|
||
posturl = '%s&%s' % (url, urllib.urlencode(data))
|
||
browser.load(posturl)
|
||
|
||
ret.append({
|
||
'KeyCode': KeyCode,
|
||
'KeyName': KeyName,
|
||
'DOC' : browser.html,
|
||
})
|
||
|
||
return ret
|
||
|
||
|
||
|
||
|