我有一个包含公司股票清单的文本文件。
我的意图是能够抓取Yahoo Finance以获得这些股票的财务数据。
我不知道如何告诉Python遍历我的文本文件中的每一行,将其分配给一个变量,然后抓取该特定Yahoo Finance页面并检索其数据并将其存储,并重复此过程以获取多少行情包含在文本文件中。
我在网上找到了一些代码,可以从Yahoo Finance抓取数据。 然后,我尝试添加一个for循环,以便将每个代码添加到一个符号变量中(请参见代码)。
def scrape_table(url):
page = requests.get(url)
tree = html.fromstring(page.content)
table = tree.xpath('//table')
assert len(table) == 1
df = pd.read_html(lxml.etree.tostring(table[0], method='html'))[0]
df = df.set_index(0)
df = df.dropna()
df = df.transpose()
df = df.replace('-', '0')
# The first column should be a date
df[df.columns[0]] = pd.to_datetime(df[df.columns[0]])
cols = list(df.columns)
cols[0] = 'Date'
df = df.set_axis(cols, axis='columns', inplace=False)
numeric_columns = list(df.columns)[1::]
df[numeric_columns] = df[numeric_columns].astype(np.float64)
return df
symbol = []
tf = open("SMI_tickers.txt")
for line in tf.readlines():
symbol.append(print(line))
balance_sheet_url = 'https://finance.yahoo.com/quote/' + symbol +
'/balance-sheet?p=' + symbol
df_balance_sheet = scrape_table(balance_sheet_url)
df_balance_sheet
我收到的错误消息是
TypeError:只能将str(而不是“ list”)连接到str
我的最终目标是能够为每个公司导入财务数据,以便我可以对每只股票进行一些计算。
答案 0 :(得分:0)
您试图传递列表而不是字符串。您需要遍历文件中的所有符号,可以按照以下步骤进行操作。这段代码会将抓取功能的结果(我尚未测试)附加到列表balance_sheets中。
balance_sheets=[]
tf = open("SMI_tickers.txt")
for line in tf.readlines():
symbol.append(line)
balance_sheet_url = 'https://finance.yahoo.com/quote/' + line + '/balance-sheet?p=' + line
balance_sheets.append(scrape_table(balance_sheet_url))
答案 1 :(得分:0)
我假设您的SMI_tickers.txt有一个股票代码列表,每行一个符号。当您构建URL时,错误出现了,您尝试连接符号,它是一个列表,而不是字符串。
将您的代码更改为以下内容。
tf = open("SMI_tickers.txt")
for line in tf.readlines():
symbol.append(line)
for symb in symbol:
balance_sheet_url = 'https://finance.yahoo.com/quote/' + symb +
'/balance-sheet?p=' + symb
df_balance_sheet = scrape_table(balance_sheet_url)
df_balance_sheet
您实际上不需要将符号读入列表中,只需从没有列表的文件中获取符号即可使用符号。
tf = open("SMI_tickers.txt")
for line in tf.readlines():
balance_sheet_url = 'https://finance.yahoo.com/quote/' + line+
'/balance-sheet?p=' + line
df_balance_sheet = scrape_table(balance_sheet_url)
df_balance_sheet
在两种情况下df_balance_sheet都是您的熊猫数据框。
答案 2 :(得分:0)
有关刮除资产负债表的信息,以及其他您可能需要的信息,请查看yahoo_fin软件包http://theautomatic.net/yahoo_fin-documentation/ 使事情变得简单
import pandas as pd
from yahoo_fin.stock_info import get_balance_sheet
stock_list = ["AAPL", "IBM", "AMZN"]
all_data = {ticker: get_balance_sheet(ticker)
for ticker in stock_list}
aapl = pd.DataFrame(all_data['AAPL'])
aapl = aapl.set_index('Period Ending')
希望这会有所帮助