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'>已停診&#185;</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'>&#185;'已停診':表示醫師暫時離開診間或已結束看診。</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'>&#185;'已停診':表示醫師暫時離開診間或已結束看診。</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)


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>馬偕紀念醫院 Mackay Memorial Hospital</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link href="Styles.css" rel="stylesheet" type="text/css"/>
<link href="mmh.ico" rel="shortcut icon"/>
</head>
<body>
<table id="tblHosp">
<tr>
<td style="width:100%;text-align:center;">
<!--<img src='Images/mmh_title1.png' alt='' />-->
<img border="0" id="TOP1_imgTitle" src="Images/mmh_title1_HC.jpg"/>
</td>
<td style="width:50%;">
              
            
            
        </td>
</tr>
</table>
<table id="TOP1_tblMenu">
<tr>
<td><a href="http://www.hc.mmh.org.tw/">醫院首頁</a></td>
<td><a href="default.aspx?Lang=C">掛號首頁</a></td>
<td><a href="Query.aspx?Lang=C">查詢與取消</a></td>
<td><a href="OpdProgress.aspx?Lang=C">看診進度</a></td>
</tr>
</table>
<form action="OpdProgress.aspx" id="frmOpdInfo" method="post" name="frmOpdInfo">
<input id="__VIEWSTATE" name="__VIEWSTATE" type="hidden" value="/wEPDwUJNzUwODY3MzU2ZGQ/5pwa8U+HvAYZBqUHOdkwOBh18g=="/>
<input id="__VIEWSTATEGENERATOR" name="__VIEWSTATEGENERATOR" type="hidden" value="EBEC0802"/>
<input id="__EVENTVALIDATION" name="__EVENTVALIDATION" type="hidden" value="/wEWBALM5emZDwKy/NbfCQLvjry/BQKRpMfqAV+qFUIMqNhUPcvmu1zsKshi+SSq"/>
<table class="OpdInfo">
<tr>
<td>
</td>
</tr>
</table>
<table class="OpdInfo" id="tblOpdInfo_select">
<tr>
<td rowspan="2" width="8%"></td>
<td align="center" rowspan="2" style="color: #000000; font-size: large; font-weight: bolder;" width="15%">請先選擇</td>
<td align="right" bgcolor="White" width="15%">午別:</td>
<td align="left" bgcolor="White" width="35%">
<select id="cboAp" name="cboAp">
<option selected="selected" value="1">上午 AM</option>
<option value="2">下午 PM</option>
<option value="3">夜間 Night</option>
</select>
</td>
<td align="center" rowspan="2" width="15%">
<input id="btnQuery" name="btnQuery" type="submit" value="查詢"/>
</td>
<td rowspan="2" width="8%"></td>
</tr>
<tr>
<td align="right" bgcolor="White" height="30px" width="15%">科別:</td>
<td align="left" bgcolor="White" height="30px" width="35%">
<select id="cboDept" name="cboDept">
<option selected="selected" value="12">內分泌暨新陳代謝科-12</option>
<option value="13">胃腸肝膽科-13</option>
<option value="14">心臟內科-14</option>
<option value="15">胸腔內科-15</option>
<option value="16">腎臟內科-16</option>
<option value="18">血液科-18</option>
<option value="19">過敏免疫風濕科-19</option>
<option value="26">感染科-26</option>
<option value="50">一般外科-50</option>
<option value="51">小兒外科-51</option>
<option value="52">骨科-52</option>
<option value="53">神經外科-53</option>
<option value="54">泌尿科-54</option>
<option value="55">整形外科-55</option>
<option value="69">美容門診-69</option>
<option value="56">大腸直腸外科-56</option>
<option value="57">乳房外科-57</option>
<option value="67">心臟血管外科-67</option>
<option value="68">胸腔外科-68</option>
<option value="30">小兒科-30</option>
<option value="40">婦產科-40</option>
<option value="20">神經內科-20</option>
<option value="21">精神科-21</option>
<option value="24">皮膚科-24</option>
<option value="28">疼痛科-28</option>
<option value="70">眼科-70</option>
<option value="71">耳鼻喉科-71</option>
<option value="73">復健科-73</option>
<option value="74">放射腫瘤科-74</option>
<option value="75">家庭醫學科-75</option>
</select>
</td>
</tr>
</table>
<table class="OpdInfo" id="tblOpdInfo">
<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><a href="#m1">已停診¹</a></td>
<td></td>
</tr>
</table>
<table class="OpdInfo">
<tr>
<td><span id="lblNotice"><ul><li>資料時間:2017/10/25 14:44:39</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></li></ul></span></td>
</tr>
</table>
</form>
<p align="center">本網頁內容為財團法人馬偕紀念醫院所有,非經授權禁止轉載。</p>
</body>
</html>


In [4]:
#<table class="OpdInfo" id="tblOpdInfo">

table = soup.find("table", id="tblOpdInfo")
print(table)


<table class="OpdInfo" id="tblOpdInfo">
<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><a href="#m1">已停診¹</a></td>
<td></td>
</tr>
</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]:
位置 午別 目前看診號 科別 醫師
0 福音樓 02樓 上午 已停診¹ 12內分10診 4038蕭雅純

In [ ]: