CJRobert's picture
Create app.py
b673ab0 verified
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分鐘自動更新一次")