| import requests |
| from bs4 import BeautifulSoup |
|
|
| def get_stock_info(ticker): |
| url = f"https://www.screener.in/company/{ticker.upper()}/consolidated/" |
| headers = { |
| "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" |
| } |
| |
| response = requests.get(url, headers=headers) |
| if response.status_code == 404: |
| url = f"https://www.screener.in/company/{ticker.upper()}/" |
| response = requests.get(url, headers=headers) |
| |
| if response.status_code != 200: |
| return {"error": f"Failed to fetch data for {ticker.upper()}. Status {response.status_code}"} |
| |
| soup = BeautifulSoup(response.text, 'html.parser') |
| |
| data = { |
| "ticker": ticker.upper(), |
| "key_metrics": {}, |
| "pros": [], |
| "cons": [], |
| "growth": [], |
| "history": {} |
| } |
| |
| |
| top_ratios = soup.find('ul', id='top-ratios') |
| if top_ratios: |
| for li in top_ratios.find_all('li'): |
| n_span = li.find('span', class_='name') |
| v_span = li.find('span', class_='value') |
| if n_span and v_span: |
| name = n_span.text.strip().replace('₹', 'Rs.') |
| val = ' '.join(v_span.text.split()).replace('₹', 'Rs.') |
| data["key_metrics"][name] = val |
| |
| |
| analysis = soup.find('section', id='analysis') |
| if analysis: |
| pros = analysis.find('div', class_='pros') |
| if pros: |
| data["pros"] = [li.text.strip() for li in pros.find_all('li')] |
| cons = analysis.find('div', class_='cons') |
| if cons: |
| data["cons"] = [li.text.strip() for li in cons.find_all('li')] |
| |
| |
| ranges = soup.find_all('table', class_='ranges-table') |
| for table in ranges: |
| th = table.find('th') |
| if not th: continue |
| metric = th.text.strip() |
| for tr in table.find_all('tr')[1:]: |
| tds = tr.find_all('td') |
| if len(tds) == 2: |
| data["growth"].append({ |
| "Metric": metric, |
| "Period": tds[0].text.strip(), |
| "Value": tds[1].text.strip() |
| }) |
| |
| |
| sections = { |
| 'quarters': 'Quarterly Results', |
| 'profit-loss': 'Profit & Loss', |
| 'balance-sheet': 'Balance Sheet', |
| 'cash-flow': 'Cash Flows', |
| 'ratios': 'Financial Ratios', |
| 'shareholding': 'Shareholding Pattern' |
| } |
| for sec_id, sec_name in sections.items(): |
| sec = soup.find('section', id=sec_id) |
| if not sec: continue |
| tbl = sec.find('table') |
| if not tbl: continue |
| thead = tbl.find('thead') |
| headers = [th.text.strip().replace('₹', 'Rs.') for th in thead.find_all('th')] if thead else [] |
| rows = [] |
| for tr in tbl.find('tbody').find_all('tr'): |
| cols = [td.text.strip().replace('₹', 'Rs.') for td in tr.find_all('td')] |
| rname = tr.find('td', class_='text') |
| if rname: |
| cols[0] = rname.text.replace('+', '').strip() |
| if cols: |
| rows.append(cols) |
| if headers and len(headers) == len(rows[0]) - 1: |
| headers.insert(0, 'Metric') |
| data["history"][sec_id] = { |
| "title": sec_name, |
| "headers": headers, |
| "rows": rows |
| } |
| |
| return data |
|
|