Skip to content

Scraping prescription drug prices from Rx site using the prescription drug name and zipcode #5959

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Change requests after code review
  • Loading branch information
saptarshi1996 committed Jan 30, 2022
commit 07174693ad1091d22c89a1721e3e6fb3c40487ae
92 changes: 31 additions & 61 deletions web_programming/fetch_well_rx_price.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,12 @@

"""

import lxml

from typing import Union
from requests import Response, get
from urllib.error import HTTPError
from requests import get, exceptions
from bs4 import BeautifulSoup


def format_price(price: str) -> float:
"""[summary]

Remove the dollar from the string and convert it to float.

Args:
price (str): [price of drug in string format]

Returns:
float: [formatted price of drug in float]

>>> format_price("$14")
14.0

>>> format_price("$15.67")
15.67

>>> format_price("$0.00")
0.0

"""
dollar_removed: str = price.replace("$", "")
formatted_price: float = float(dollar_removed)
return formatted_price


def fetch_pharmacy_and_price_list(drug_name: str, zip_code: str) -> Union[list, None]:
"""[summary]

Expand Down Expand Up @@ -65,51 +38,48 @@ def fetch_pharmacy_and_price_list(drug_name: str, zip_code: str) -> Union[list,
if not drug_name or not zip_code:
return None

request_url: str = f"https://www.wellrx.com/prescriptions/{drug_name}/{zip_code}/?freshSearch=true"
response: Response = get(request_url)

# Is the status code ok?
if response.status_code == 200:
request_url = f"https://www.wellrx.com/prescriptions/{drug_name}/{zip_code}/?freshSearch=true"
response = get(request_url)

# Scrape the data using bs4
soup: BeautifulSoup = BeautifulSoup(response.text, "lxml")
# Is the response ok?
response.raise_for_status()

# This list will store the name and price.
pharmacy_price_list: list = []
# Scrape the data using bs4
soup = BeautifulSoup(response.text, "html.parser")

# Fetch all the grids that contains the items.
grid_list: list = soup.find_all("div", {"class": "grid-x pharmCard"})
if grid_list and len(grid_list) > 0:
for grid in grid_list:
# This list will store the name and price.
pharmacy_price_list = []

# Get the pharmacy price.
pharmacy_name: str = grid.find("p", {"class": "list-title"}).text
# Fetch all the grids that contains 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 price of the drug.
price: str = grid.find("span", {"p", "price price-large"}).text
formatted_price: float = format_price(price)
# Get the pharmacy price.
pharmacy_name = grid.find("p", {"class": "list-title"}).text

pharmacy_price_list.append(
{
"pharmacy_name": pharmacy_name,
"price": formatted_price,
}
)
# Get price of the drug.
price = grid.find("span", {"p", "price price-large"}).text

return pharmacy_price_list
pharmacy_price_list.append(
{
"pharmacy_name": pharmacy_name,
"price": price,
}
)

else:
return None
return pharmacy_price_list

except Exception as e:
except (HTTPError, exceptions.RequestException, ValueError):
return None


if __name__ == "__main__":

# Enter a drug name and a zip code
drug_name: str = input("Enter drug Name:\n")
zip_code: str = input("Enter zip code:\n")
drug_name = input("Enter drug name: ").strip()
zip_code = input("Enter zip code: ").strip()

pharmacy_price_list: Union[list, None] = fetch_pharmacy_and_price_list(
drug_name, zip_code
)
Expand All @@ -119,8 +89,8 @@ def fetch_pharmacy_and_price_list(drug_name: str, zip_code: str) -> Union[list,
print(f"\nSearch results for {drug_name} at location {zip_code}:")
for pharmacy_price in pharmacy_price_list:

name: str = pharmacy_price["pharmacy_name"]
price: float = pharmacy_price["price"]
name = pharmacy_price["pharmacy_name"]
price = pharmacy_price["price"]

print(f"Pharmacy: {name} Price: {price}")
else:
Expand Down