'ValueError: 4 columns passed, passed data had 1 columns

'NEW LEARNER' If data in column from webpage is not an integer, I cannot append the row to my data frame. [webpage data as seen by this image] (https://i.stack.imgur.com/KBjRU.png)

Here is my code:

import pandas as pd import requests from datetime import datetime from bs4 import BeautifulSoup

ticker = input("Type your ticker symbol: ") def get_balance_sheet_from_yfinance_web(ticker): url = f"https://finance.yahoo.com/quote/%7Bticker%7D/balance-sheet?p=%7Bticker%7D" header = {'Connection': 'keep-alive', 'Expires': '-1', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36' }

r = requests.get(url, headers=header)
html = r.text
soup = BeautifulSoup(html, "html.parser")
div = soup.find_all('div', attrs={'class': 'D(tbhg)'})
if len(div) < 1:
    print("Fail to retrieve table column header")
    exit(0)

col = []
pd.set_option('max_colwidth', None)
for h in div[0].find_all('span'):
    text = h.get_text()
    if text != "Breakdown":
        col.append(datetime.strptime(text, "%m/%d/%Y"))

df = pd.DataFrame(columns=col)
pd.set_option('max_colwidth', None)
for div in soup.find_all('div', attrs={'data-test': 'fin-row'}):
    i = 0
    idx = ""
    val = []
    for h in div.find_all('span'):
        if i == 0:
            idx = h.get_text()
        else:
            num = int(h.get_text().replace(",", "")) * 1000
            val.append(num)
        i += 1
    row = pd.DataFrame([val], columns=col, index=[idx])

    df = df.append(row)
            df.to_csv(f'{ticker}.csv')

return df

print(get_balance_sheet_from_yfinance_web(ticker))

I have tried replace('-', 0)



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source