From b9e52876086c6041db4770631f5fff9b305a953b Mon Sep 17 00:00:00 2001 From: Thrive <147845726+VAIBHAVVARORA@users.noreply.github.com> Date: Fri, 26 Sep 2025 15:17:00 +0530 Subject: [PATCH 1/2] Refactor error handling and improve logging --- web_programming/covid_stats_via_xpath.py | 41 +++++++++++++++++++----- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/web_programming/covid_stats_via_xpath.py b/web_programming/covid_stats_via_xpath.py index 88a248610441..55356414d163 100644 --- a/web_programming/covid_stats_via_xpath.py +++ b/web_programming/covid_stats_via_xpath.py @@ -12,7 +12,10 @@ # "lxml", # ] # /// +from __future__ import annotations +import argparse +import logging from typing import NamedTuple import httpx @@ -33,27 +36,49 @@ def covid_stats( ) -> CovidData: xpath_str = '//div[@class = "maincounter-number"]/span/text()' try: - response = httpx.get(url, timeout=10).raise_for_status() + response = httpx.get(url, timeout=10) + response.raise_for_status() except httpx.TimeoutException: - print( + logging.error( "Request timed out. Please check your network connection " "or try again later." ) return CovidData("N/A", "N/A", "N/A") except httpx.HTTPStatusError as e: - print(f"HTTP error occurred: {e}") + logging.error(f"HTTP error occurred: {e}") return CovidData("N/A", "N/A", "N/A") - data = html.fromstring(response.content).xpath(xpath_str) + data : list[str] = html.fromstring(response.content).xpath(xpath_str) if len(data) != 3: - print("Unexpected data format. The page structure may have changed.") - data = "N/A", "N/A", "N/A" + logging.warning("Unexpected data format. The page structure may have changed.") + return CovidData("N/A", "N/A", "N/A") + return CovidData(*data) +def main() -> None: + """CLI entry point.""" + parser = argparse.ArgumentParser( + description="Fetch COVID-19 statistics from Worldometers (archived)." + ) + parser.add_argument( + "--url", + type=str, + default=( + "https://web.archive.org/web/20250825095350/" + "https://www.worldometers.info/coronavirus/" + ), + help="Custom archive URL (default: latest snapshot).", + ) + # args = parser.parse_args() + args, _ = parser.parse_known_args() -if __name__ == "__main__": + stats = covid_stats(args.url) fmt = ( "Total COVID-19 cases in the world: {}\n" "Total deaths due to COVID-19 in the world: {}\n" "Total COVID-19 patients recovered in the world: {}" ) - print(fmt.format(*covid_stats())) + print(fmt.format(*stats)) + + +if __name__ == "__main__": + main() From e73d0c307517a59a227c3ba709b1342e0c3d0363 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 26 Sep 2025 09:52:16 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- web_programming/covid_stats_via_xpath.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web_programming/covid_stats_via_xpath.py b/web_programming/covid_stats_via_xpath.py index 55356414d163..0151ac29de55 100644 --- a/web_programming/covid_stats_via_xpath.py +++ b/web_programming/covid_stats_via_xpath.py @@ -47,13 +47,14 @@ def covid_stats( except httpx.HTTPStatusError as e: logging.error(f"HTTP error occurred: {e}") return CovidData("N/A", "N/A", "N/A") - data : list[str] = html.fromstring(response.content).xpath(xpath_str) + data: list[str] = html.fromstring(response.content).xpath(xpath_str) if len(data) != 3: logging.warning("Unexpected data format. The page structure may have changed.") return CovidData("N/A", "N/A", "N/A") return CovidData(*data) + def main() -> None: """CLI entry point.""" parser = argparse.ArgumentParser(