import requests from bs4 import BeautifulSoup class EnvironmentalData: def __init__(self, city): self.city = city self.aqi_url = f"https://api.waqi.info/feed/{city}/?token=466cde4d55e7c5d6cc658ad9c391214b593f46b9" self.uv_url = f"https://www.weatheronline.co.uk/Pakistan/{city}/UVindex.html" def fetch_aqi_data(self): try: response = requests.get(self.aqi_url) data = response.json() if data["status"] == "ok": return { "Temperature": data["data"]["iaqi"].get("t", {}).get("v", "N/A"), "Humidity": data["data"]["iaqi"].get("h", {}).get("v", "N/A"), "Wind Speed": data["data"]["iaqi"].get("w", {}).get("v", "N/A"), "Pressure": data["data"]["iaqi"].get("p", {}).get("v", "N/A"), "AQI": data["data"].get("aqi", "N/A"), "Dominant Pollutant": data["data"].get("dominentpol", "N/A"), } return self.get_default_aqi_data() except: return self.get_default_aqi_data() def get_default_aqi_data(self): return { "Temperature": "N/A", "Humidity": "N/A", "Wind Speed": "N/A", "Pressure": "N/A", "AQI": "N/A", "Dominant Pollutant": "N/A" } def fetch_uv_data(self): try: response = requests.get(self.uv_url) soup = BeautifulSoup(response.text, 'html.parser') gr1_elements = soup.find_all(class_='gr1') if gr1_elements: tr_elements = gr1_elements[0].find_all('tr') if len(tr_elements) > 1: second_tr = tr_elements[1] td_elements = second_tr.find_all('td') if len(td_elements) > 1: return int(td_elements[1].text.strip()) return "N/A" except: return "N/A" def get_environmental_data(self): aqi_data = self.fetch_aqi_data() uv_index = self.fetch_uv_data() environmental_data = { "Temperature": f"{aqi_data['Temperature']} °C" if aqi_data['Temperature'] != "N/A" else "N/A", "Humidity": f"{aqi_data['Humidity']} %" if aqi_data['Humidity'] != "N/A" else "N/A", "Wind Speed": f"{aqi_data['Wind Speed']} m/s" if aqi_data['Wind Speed'] != "N/A" else "N/A", "Pressure": f"{aqi_data['Pressure']} hPa" if aqi_data['Pressure'] != "N/A" else "N/A", "Air Quality Index": aqi_data['AQI'], "Dominant Pollutant": aqi_data["Dominant Pollutant"], "UV_Index": uv_index } return environmental_data