mirror of
https://github.com/TheAlgorithms/Python.git
synced 2026-09-28 21:45:27 +08:00
* deps: migrate from httpx to httpx2 (pydantic's maintained fork) Mechanical rename of httpx -> httpx2 (API-compatible fork of httpx 0.28.1): pyproject.toml deps, PEP 723 inline-script headers, and all import/call sites. Excludes uv.lock (the keeper's allow-list rejects .lock files); the lock refresh needs a separate maintainer-merged PR. Refs #15081 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * deps: drop tweepy + migrate remaining requests refs to httpx2 - maths/allocation_number.py: docstring example uses httpx2, not requests - web_programming/get_imdbtop.py.DISABLED: import httpx2 instead of requests - remove web_programming/get_user_tweets.py.DISABLED (a Twitter API how-to, not an algorithm) and drop the tweepy dependency that was its only user and the last high-level dep pulling in requests - uv.lock intentionally untouched (keeper allow-list) Refs #15081 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
92 lines
2.7 KiB
Python
92 lines
2.7 KiB
Python
"""
|
|
|
|
Scrape the price and pharmacy name for a prescription drug from rx site
|
|
after providing the drug name and zipcode.
|
|
|
|
"""
|
|
|
|
import httpx2
|
|
from bs4 import BeautifulSoup
|
|
|
|
BASE_URL = "https://www.wellrx.com/prescriptions/{}/{}/?freshSearch=true"
|
|
|
|
|
|
def fetch_pharmacy_and_price_list(drug_name: str, zip_code: str) -> list | None:
|
|
"""[summary]
|
|
|
|
This function will take input of drug name and zipcode,
|
|
then request to the BASE_URL site.
|
|
Get the page data and scrape it to generate the
|
|
list of the lowest prices for the prescription drug.
|
|
|
|
Args:
|
|
drug_name (str): [Drug name]
|
|
zip_code(str): [Zip code]
|
|
|
|
Returns:
|
|
list: [List of pharmacy name and price]
|
|
|
|
>>> print(fetch_pharmacy_and_price_list(None, None))
|
|
None
|
|
>>> print(fetch_pharmacy_and_price_list(None, 30303))
|
|
None
|
|
>>> print(fetch_pharmacy_and_price_list("eliquis", None))
|
|
None
|
|
"""
|
|
|
|
try:
|
|
# Has user provided both inputs?
|
|
if not drug_name or not zip_code:
|
|
return None
|
|
|
|
request_url = BASE_URL.format(drug_name, zip_code)
|
|
response = httpx2.get(request_url, timeout=10).raise_for_status()
|
|
|
|
# Scrape the data using bs4
|
|
soup = BeautifulSoup(response.text, "html.parser")
|
|
|
|
# This list will store the name and price.
|
|
pharmacy_price_list = []
|
|
|
|
# Fetch all the grids that contain the items.
|
|
grid_list = soup.find_all("div", {"class": "grid-x pharmCard"})
|
|
if grid_list and len(grid_list) > 0:
|
|
for grid in grid_list:
|
|
# Get the pharmacy price.
|
|
pharmacy_name = grid.find("p", {"class": "list-title"}).text
|
|
|
|
# Get the price of the drug.
|
|
price = grid.find("span", {"p", "price price-large"}).text
|
|
|
|
pharmacy_price_list.append(
|
|
{
|
|
"pharmacy_name": pharmacy_name,
|
|
"price": price,
|
|
}
|
|
)
|
|
|
|
return pharmacy_price_list
|
|
|
|
except httpx2.HTTPError, ValueError:
|
|
return None
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Enter a drug name and a zip code
|
|
drug_name = input("Enter drug name: ").strip()
|
|
zip_code = input("Enter zip code: ").strip()
|
|
|
|
pharmacy_price_list: list | None = fetch_pharmacy_and_price_list(
|
|
drug_name, zip_code
|
|
)
|
|
|
|
if pharmacy_price_list:
|
|
print(f"\nSearch results for {drug_name} at location {zip_code}:")
|
|
for pharmacy_price in pharmacy_price_list:
|
|
name = pharmacy_price["pharmacy_name"]
|
|
price = pharmacy_price["price"]
|
|
|
|
print(f"Pharmacy: {name} Price: {price}")
|
|
else:
|
|
print(f"No results found for {drug_name}")
|