import time import json import psycopg2 import psycopg2.extensions from psycopg2.extras import Json import re import pandas as pd import requests import xmltodict import datetime from tabulate import tabulate allobs = [] states = ['wv', 'oh', 'va', 'ky'] ohcounties = ['-LW-', '-GL-', '-JC-', '-MS-', '-AT-', '-PY-', '-WS-', '-MG-', '-VN-'] vacounties = ['-DC-', '-BC-'] kycounties = ['-LR-', '-CT-', '-GP-', '-BD-'] datewanted = datetime.date.today().strftime("%m/%d/%Y") try: for state in states: url = f'https://data.cocorahs.org/export/exportreports.aspx?state={state}&Format=XML&Date={datewanted}&responsefields=all' response = requests.get(url) response.raise_for_status() # Check for HTTP errors data = xmltodict.parse(response.content.decode('utf-8')) # Explicitly decode as UTF-8 try: reports = data['Cocorahs']['DailyPrecipReports']['DailyPrecipReport'] # Handle case where reports might be a single dict or a list if isinstance(reports, dict): reports = [reports] for report in reports: if state == 'wv': allobs.append(report) else: for county in eval(state + 'counties'): if county in report['StationNumber']: allobs.append(report) except (KeyError, TypeError) as e: print(f"Error processing data for state {state}: {e}") continue # Process observations finalobs = [] for obs in allobs: tempob = [ obs.get('DateTimeStamp', ''), obs.get('StationNumber', ''), obs.get('StationName', ''), obs.get('TotalPrecipAmt', ''), obs.get('NewSnowDepth', ''), obs.get('TotalSnowDepth', ''), obs.get('Notes', '') ] finalobs.append(tempob) # Write to file with UTF-8 encoding with open('/var/www/html/work/today.txt', 'w', encoding='utf-8') as f: f.write(tabulate( finalobs, headers=["Date/Time of Ob (Z)", "Station Number", "Station Name", "New Precip", "New Snow", "Snow Depth", "Comments"], tablefmt='plain' # Changed to 'plain' for simpler text output )) except requests.RequestException as e: print(f"Error fetching data: {e}") except Exception as e: print(f"Unexpected error: {e}")