File size: 3,708 Bytes
b673ab0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import streamlit as st
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

# Set page title and configuration
st.set_page_config(
    page_title="醫院床位狀態查詢",
    page_icon="🏥",
    layout="wide"
)

# Add page header
st.title("🏥 成大醫院床位狀態查詢")
st.markdown("這個應用程式顯示成大醫院的即時床位狀態資訊")

# Function to fetch and process data
@st.cache_data(ttl=300)  # Cache data for 5 minutes
def fetch_hospital_data():
    # URL to fetch data from
    url = "https://web.hosp.ncku.edu.tw/nckm/Bedstatus/BedStatus.aspx"
    
    try:
        # Send GET request to fetch the raw HTML content
        response = requests.get(url)
        response.raise_for_status()  # Raise an exception for bad response codes
        
        # Parse HTML content
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # Extract the table with the data
        table = soup.find('table', {'id': 'GV_EmgInsure'})
        
        if table:
            # Extract the header and rows of the table
            headers = [header.text.strip() for header in table.find_all('th')]
            rows = table.find_all('tr')[1:]  # Skip the first row (header)
            
            # Extract data from each row
            data = []
            for row in rows:
                columns = row.find_all('td')
                data.append([column.text.strip() for column in columns])
            
            # Convert data to pandas DataFrame
            df = pd.DataFrame(data, columns=headers)
            return df, None
        else:
            return None, "找不到數據表格,網站可能已更改"
    
    except requests.exceptions.RequestException as e:
        return None, f"獲取數據時出錯: {str(e)}"
    except Exception as e:
        return None, f"處理數據時出錯: {str(e)}"

# Add refresh button and last update time display
col1, col2 = st.columns([1, 4])
with col1:
    if st.button("刷新數據"):
        st.cache_data.clear()
        st.success("數據已刷新!")

# Display the current time
with col2:
    st.write(f"最後更新時間: {time.strftime('%Y-%m-%d %H:%M:%S')}")

# Create a spinner while loading data
with st.spinner("正在獲取最新床位數據..."):
    df, error = fetch_hospital_data()

# Display error if any
if error:
    st.error(error)
else:
    # Display dataframe if available
    if df is not None:
        # Display summary metrics
        st.subheader("床位狀態概覽")
        try:
            # This assumes there's a column with available beds info
            # Adjust column names as needed based on actual data
            if '可用總數' in df.columns:
                total_available = df['可用總數'].astype(int).sum()
                st.metric("總可用床位", total_available)
            
            # Display the full dataset in a table
            st.subheader("詳細數據")
            st.dataframe(df, use_container_width=True)
            
            # Add download button
            csv = df.to_csv(index=False)
            st.download_button(
                label="下載CSV檔案",
                data=csv,
                file_name="hospital_bed_status.csv",
                mime="text/csv",
            )
        except Exception as e:
            st.warning(f"處理數據時出錯: {str(e)}")
    else:
        st.warning("無法獲取數據,請檢查網絡連接或稍後再試")

# Add footer
st.markdown("---")
st.markdown("數據來源: [成大醫院](https://web.hosp.ncku.edu.tw/nckm/Bedstatus/BedStatus.aspx)")
st.markdown("注意: 此應用程式僅用於演示目的,數據每5分鐘自動更新一次")