Отказ от Yahoo Finance после недавних изменений Oc 2019 - PullRequest
0 голосов
/ 02 октября 2019
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 года. Финансы Yahoo закрыли этот год для этой компании, однако для других компаний наступил 2015 год.

Что я могу сделать, чтобы устранить такую ​​ошибку для этого конкретного года и символа. Я попытался использовать «None» в функции для долгосрочной переменной, однако это не работает. Есть идеи, как подойти к этому делу?

Формула, которую пытались использовать:

def debt():
    if df.iloc[0,4]== None : return 0
    else: float(str(df.iloc[0,4]).replace(',',''))

Однако она не работает

1 Ответ

1 голос
/ 06 октября 2019

Вы должны установить библиотеку YahooFinancials на свой питон.

import lxml
from lxml import html
import requests
import numpy as np
import pandas as pd

symbol = 'ORCL'

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()
#Adding columns
df = pd.DataFrame(columns=Headers,index=[1])
item5 = 'Inventory'
row5 = []
row5.append(item5)

Xpath = "//span[contains(.,'"+item5+"')]/parent::div/parent::div/following-sibling::div"

rowvalues5 = tree.xpath(Xpath) # identify all 4 high level nodes
# This will store the high level node values, but store 'None' if value is not present.
for value5 in rowvalues5:
    row5.append(value5.text)
 #if the value is None, we are going to fetch to next level node values using /span   
Xpath = Xpath+"/span"
Childvalues = tree.xpath(Xpath) #Fetch low level nodes
j=0
for i in range(len(row5)):
    if(row5[i]==None):
        row5[i] =Childvalues[j].text
        j=j+1


df.loc[1] = row5

print(df)
...