File size: 4,272 Bytes
a39ebf9 |
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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
#!/usr/bin/env python
# coding: utf-8
# In[10]:
import requests
import pandas as pd
from io import BytesIO
from bs4 import BeautifulSoup
# URL of the website to scrape
url = "https://www.ireland.ie/en/india/newdelhi/services/visas/processing-times-and-decisions/"
# Headers to mimic a browser request
headers = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
)
}
# Send an HTTP GET request to the website
response = requests.get(url, headers=headers)
# Check if the request was successful
if response.status_code == 200:
# Parse the HTML content of the page
soup = BeautifulSoup(response.content, 'html.parser')
# Find all anchor tags
links = soup.find_all('a')
# Search for the link that contains the specific text
file_url = None
for link in links:
link_text = link.get_text(strip=True)
if "Visa decisions made from 1 January 2024 to" in link_text:
file_url = link.get('href')
break
# Check if the link was found
if file_url:
# Make the link absolute if it is relative
if not file_url.startswith('http'):
file_url = requests.compat.urljoin(url, file_url)
print(f"Found link: {file_url}")
# Download the file into memory
file_response = requests.get(file_url, headers=headers)
if file_response.status_code == 200:
# Load the file into a BytesIO object
ods_file = BytesIO(file_response.content)
# Read the .ods file using pandas
try:
# Load the .ods file into a DataFrame
df = pd.read_excel(ods_file, engine='odf')
# Step 1: Clean the DataFrame
# Drop the first two columns
df.drop(columns=["Unnamed: 0", "Unnamed: 1"], inplace=True)
# Step 2: Drop NaN rows until we find the actual header row
df.dropna(how='all', inplace=True)
# Step 3: Reset index and rename the header row
df.reset_index(drop=True, inplace=True)
# Step 4: Find the row where "Application Number" starts
for idx, row in df.iterrows():
if row['Unnamed: 2'] == 'Application Number' and row['Unnamed: 3'] == 'Decision':
df.columns = ['Application Number', 'Decision']
df = df.iloc[idx + 1:] # Skip the header row
break
# Step 5: Reset the index after cleaning
df.reset_index(drop=True, inplace=True)
# Convert "Application Number" to string for consistency
df['Application Number'] = df['Application Number'].astype(str)
# Display the cleaned DataFrame
#print("Cleaned Data:")
#print(df.to_string(index=False))
# Step 6: Ask the user for their application number
user_application_number = input("\nEnter your Application Number: ").strip()
# Step 7: Check if the application number exists in the DataFrame
result = df[df['Application Number'] == user_application_number]
if not result.empty:
print(f"\nCongratulations! Your visa application ({user_application_number}) has been {result.iloc[0]['Decision']}.")
else:
print(f"\nSorry, no record found for Application Number: {user_application_number}.")
except Exception as e:
print("Error reading the .ods file:", e)
else:
print("Failed to download the file. Status code:", file_response.status_code)
else:
print("The specified link was not found.")
else:
print(f"Failed to retrieve the webpage. Status code: {response.status_code}")
|