Repository navigation
Expand file tree
/
Copy pathcovid_stats_via_xpath.py
More file actions
86 lines (72 loc) · 2.28 KB
/
Copy pathcovid_stats_via_xpath.py
File metadata and controls
86 lines (72 loc) · 2.28 KB
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
"""
This script demonstrates fetching simple COVID-19 statistics from the
Worldometers archive site using lxml. lxml is chosen over BeautifulSoup
for its speed and convenience in Python web projects (such as Django or
Flask).
uv run --script web_programming/covid_stats_via_xpath.py
"""
# /// script
# requires-python = ">=3.13"
# dependencies = [
# "httpx2",
# "lxml",
# ]
# ///
from __future__ import annotations
import argparse
import logging
from typing import NamedTuple
import httpx2
from lxml import html
class CovidData(NamedTuple):
cases: str
deaths: str
recovered: str
def covid_stats(
url: str = (
"https://web.archive.org/web/20250825095350/"
"https://www.worldometers.info/coronavirus/"
),
) -> CovidData:
xpath_str = '//div[@class = "maincounter-number"]/span/text()'
try:
response = httpx2.get(url, timeout=10).raise_for_status()
except httpx2.TimeoutException:
logging.error(
"Request timed out. Please check your network connection "
"or try again later."
)
return CovidData("N/A", "N/A", "N/A")
except httpx2.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)
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(
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()
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(*stats))
if __name__ == "__main__":
main()