In [1]:
#新竹馬階紀念醫院 Hsinchu MacKay Memorial Hospital
#看診進度查詢: https://hcreg.mmh.org.tw/OpdProgress.aspx
#查詢選項說明:
#午別 (cboAp): 1:上午 AM, 2:下午 PM, 3.夜間 Night
#科別 (cboDept):
# 內分泌暨新陳代謝科-12, 胃腸肝膽科-13, 心臟內科-14, 胸腔內科-15
# 腎臟內科-16, 血液科-18, 過敏免疫風濕科-19, 感染科-26, 一般外科-50
# 小兒外科-51, 骨科-52, 神經外科-53, 泌尿科-54, 整形外科-55
# 美容門診-69, 大腸直腸外科-56, 乳房外科-57, 心臟血管外科-67
# 胸腔外科-68, 小兒科-30, 婦產科-40, 神經內科-20, 精神科-21
# 皮膚科-24, 疼痛科-28, 眼科-70, 耳鼻喉科-71, 復健科-73
# 放射腫瘤科-74, 家庭醫學科-75
In [2]:
#查詢回傳HTML樣本:
# <table id="tblOpdInfo" class="OpdInfo">
# <tr class="col_label">
# <td style="width:10%;">午別</td>
# <td style="width:22%;">位置</td>
# <td style="width:23%;">科別</td>
# <td style="width:25%;">醫師</td>
# <td style="width:10%;">目前看診號</td>
# <td style="width:10%;">未看診人數</td>
# </tr>
# <tr>
# <td>上午</td>
# <td>平安樓 02樓</td>
# <td>30兒科02診</td>
# <td>4976連啟宏</td>
# <td><a href='#m1'>已停診¹</a></td>
# <td></td>
# </tr>
#</table>
# <table class="OpdInfo">
# <tr>
# <td><span id="lblNotice"><ul><li>資料時間:2017/10/25 13:35:03</li><li id='m1'>¹'已停診':表示醫師暫時離開診間或已結束看診。</li><li>醫師若未顯示:表示醫師尚未開始看診或已結束看診超過一小時。</li><li>目前看診號僅供參考,各午別應診時間:<ul><li>上午:09:00 ~ 12:00</li><li>下午:14:00 ~ 17:00</li><li>夜診:17:30 ~ 20:30</li></ul></ul></span></td>
# </tr>
# </table>
#==============================================================================
# <table id="tblOpdInfo" class="OpdInfo">
# <tr class="col_label">
# <td style="width:10%;">午別</td>
# <td style="width:22%;">位置</td>
# <td style="width:23%;">科別</td>
# <td style="width:25%;">醫師</td>
# <td style="width:10%;">目前看診號</td>
# <td style="width:10%;">未看診人數</td>
# </tr>
# <tr>
# <td>上午</td>
# <td>福音樓 02樓</td>
# <td>12內分10診</td>
# <td>4038蕭雅純</td>
# <td>76號</td>
# <td>11</td>
# </tr>
#</table>
# <table class="OpdInfo">
# <tr>
# <td><span id="lblNotice"><ul><li>資料時間:2017/10/25 13:50:05</li><li id='m1'>¹'已停診':表示醫師暫時離開診間或已結束看診。</li><li>醫師若未顯示:表示醫師尚未開始看診或已結束看診超過一小時。</li><li>目前看診號僅供參考,各午別應診時間:<ul><li>上午:09:00 ~ 12:00</li><li>下午:14:00 ~ 17:00</li><li>夜診:17:30 ~ 20:30</li></ul></ul></span></td>
# </tr>
# </table>
In [3]:
import pandas as pd
import requests
import re
from bs4 import BeautifulSoup
#說明:
# re.search:
# (.*) => .* 代表匹配除换行符之外的所有字符。
# (.*?)=> .*? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符
sess=requests.Session()
url="https://hcreg.mmh.org.tw/OpdProgress.aspx"
res=sess.get(url)
__VIEWSTATE=re.search(b'id="__VIEWSTATE" value="(.*?)"',res.content).group(1)
__VIEWSTATEGENERATOR=re.search(b'id="__VIEWSTATEGENERATOR" value="(.*?)"',res.content).group(1)
__EVENTVALIDATION=re.search(b'id="__EVENTVALIDATION" value="(.*?)"',res.content).group(1)
body={
"__VIEWSTATE":__VIEWSTATE,
"__VIEWSTATEGENERATOR":__VIEWSTATEGENERATOR,
"__EVENTVALIDATION":__EVENTVALIDATION,
"cboAp":"1",
"btnQuery":"%ACd%B8%DF", #value:查詢
"cboDept":"12"
}
html=sess.post(url,data=body)
soup=BeautifulSoup(html.content,'html.parser')
print(soup)
In [4]:
#<table class="OpdInfo" id="tblOpdInfo">
table = soup.find("table", id="tblOpdInfo")
print(table)
In [5]:
table_text=[]
for tr in table.find_all('tr'):
tds = tr.find_all('td')
for td in tds:
table_text.append(td.get_text())
In [6]:
column_name = table_text[0:5]
column_name
Out[6]:
In [7]:
query_table = pd.DataFrame(
{'午別': table_text[6],
'位置': table_text[7],
'科別': table_text[8],
'醫師': table_text[9],
'目前看診號': table_text[10]
}, index=[0])
In [8]:
query_table
Out[8]:
In [ ]: