Hi I'm trying to build a simple webscraper of ESG data for S&P500 companies but for some reason I keep getting NameError:
name 'web_scraper' is not defined
Tried a few things now but cannot get it to work. I'm a beginner so must be overlooking something. Thanks in advance
from bs4 import BeautifulSoup
import pandas as pd
import requests
import ipywidgets as widgets
from ipywidgets import interact
def get_tickers():
# wiki_page = requests.get()
sp_data = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
ticker_df = sp_data[0]
ticker_options = ticker_df['Symbol']
return ticker_options
def level(x):
if x == 0.0:
return 'No Controversy'
elif x == 1.0:
return 'Little Controversy'
elif x == 2.0:
return 'Moderate Controversy'
elif x == 3.0:
return 'Relatively High Controversy'
else:
return 'Little Controversy'
def web_scraper(ticker):
elements = []
web_data = requests.get('https://finance.yahoo.com/quote/'+ticker+'+/sustainability?p='+ticker).text
soup = BeautifulSoup(web_data, 'html.parser')
esg_score = soup.find('div', {'class':'Fz(36px) Fw(600) D(ib) Mend(5px)'})
datapoint = esg_score.text
controversy_score = soup.find('div', {'class':'D(ib) Fz(36px) Fq(500)'})
controversy_datapoint = controversy_score.text
scores = soup.find_all('div', {'class': 'D(ib) Fz(23px) smartphone_Fz(22px) Fq(600)'})
for score in scores:
elements.append(score.text)
df = pd.DataFrame({'Total ESG Score': datapoint,
'Environment Score': elements[0],
'Social Score': elements[0],
'Governance Score': elements[2],
'Controversy Score': controversy_datapoint},
index = [ticker])
df = df.astype('float')
df['Controversy Assessment'] = df.apply(lambda x: level(x['Controversy Score']), axis=1)
return df
@interact
def get_esg(ticker=widgets.Dropdown(description='Ticker',
options=get_tickers(),
value = 'F')):
esg_data = web_scraper(ticker)
return esg_data