【发布时间】:2021-02-05 06:33:38
【问题描述】:
import lxml
from lxml import html
import requests
import numpy as np
import pandas as pd
symbol = 'AAPL'
url = 'https://finance.yahoo.com/quote/' + symbol + '/balance-sheet?p=' + symbol
page = requests.get(url)
tree = html.fromstring(page.content)
tableHeaders = tree.xpath('//*[@class="D(tbhg)"]//span')
Headers = []
for Header in tableHeaders:
Headers.append(Header.text)
df = pd.DataFrame()
df = pd.DataFrame(columns=Headers,index=[1])
Xpath1 = "//span[contains(.,'"+item1+"')]/parent::div/parent::div/following-sibling::div"
item1 = 'Long Term Debt'
row1 = []
row1.append(item1)
rowvalues1 = tree.xpath(Xpath1)
for value1 in rowvalues1:
row1.append(value1.text)
Xpath1 = Xpath1+"/span"
Childvalues1 = tree.xpath(Xpath1)
j=0
for i in range(len(row1)):
if(row1[i]==None):
row1[i] =Childvalues1[j].text
j=j+1
df.loc[1] = row1
df=df.fillna(0)
df[df=='-'] ='0'
long_term_debt=float(str(df.iloc[0,4]).replace(',',''))
当我运行 AAPL 符号时出现错误:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-63-fe5e79eabd51> in <module>
57 df[df=='-'] ='0'
58
---> 59 long_term_debt=float(str(df.iloc[0,4]).replace(',',''))
60
--
2007 l = len(ax)
2008 if key >= l or key < -l:
-> 2009 raise IndexError("single positional indexer is out-of-bounds")
2010
2011 def _getitem_tuple(self, tup):
IndexError: 单个位置索引器超出范围
我无法计算从df 中提取的价值,因为对于 AAPL,该公司没有 2015 年。雅虎金融在那一年关闭了这家公司,但对于其他公司来说是 2015 年。
我可以做些什么来消除这个特定年份和符号的此类错误。我尝试在函数中对长期变量使用“无”,但它不起作用。知道如何处理这种情况吗?
尝试使用的公式:
def debt():
if df.iloc[0,4]== None : return 0
else: float(str(df.iloc[0,4]).replace(',',''))
但它不起作用
【问题讨论】:
-
// 表格不再指向您需要的内容。你将不得不改变xpath。你想抓取什么信息。
-
我正在尝试在 Dataframe 中获取财务报表表。我怎么才能得到它?作为其他部分,我可以检索但不是这个。
-
它不再是一张桌子了。我们将不得不使用自定义 xpath 来创建一个包含必填字段的表格并作为数据框提供。 Panda 可能还有其他方法可以做到这一点。
-
你能分享一下我应该使用什么功能吗?我只用上述方法没有这样的经验。例如,在 table = tree.xpath('//table') 之后?它提取但如何转换为熊猫数据框。您建议使用什么其他方式?
-
我刚刚发布了一个带有表头的示例答案。您可以以类似的方式读取所需的行并将其添加到数据框中。
标签: python web-scraping yahoo-finance yahoo-api