Scrape Yahoo Finanzen Gewinn- und Verlustrechnung mit Python
Ich versuche, Daten aus Gewinn- und Verlustrechnungen von @ zu entferneYahoo Finance mit Python. Nehmen wir an, ich möchte das jüngste Zahl vonNettoeinkomme vonApfe.
Die Daten sind in verschachtelten HTML-Tabellen strukturiert. Ich benutze dasrequests
-Modul, um darauf zuzugreifen und den HTML-Code abzurufen.
Ich benutzeBeautifulSoup 4 um die HTML-Struktur zu sichten, aber ich kann nicht herausfinden, wie ich die Figur bekomme.
Hie ist ein Screenshot der Analyse mit Firefox.
Mein Code bisher:
from bs4 import BeautifulSoup
import requests
myurl = "https://finance.yahoo.com/q/is?s=AAPL&annual"
html = requests.get(myurl).content
soup = BeautifulSoup(html)
Ich habe versucht mit
all_strong = soup.find_all("strong")
Und dann erhalten Sie das 17. Element, das zufällig die Figur enthält, die ich möchte, aber dies scheint alles andere als elegant. Etwas wie das
all_strong[16].parent.next_sibling
...
Natürlich ist das Ziel, @ zu verwendBeautifulSoup
um nach dem @ zu suchNam der Zahl, die ich brauche (in diesem Fall "Net Income") und dann greifen Sie diefiguriert sich in der gleichen Zeile der HTML-Tabelle.
Ich würde mich über Ideen zur Lösung dieses Problems sehr freuen, wenn ich bedenke, dass ich die Lösung anwenden möchte, um eine Reihe anderer Daten von anderen Yahoo Finance-Seiten abzurufen.
LÖSUNG / ERWEITERUNG:
Die Lösung von @wilbur unten hat funktioniert und ich habe sie erweitert, um die Werte für @ zu erhalteirgendei Zahl verfügbar aufirgendei der Finanzseiten (d. h.Gewinn- und Verlustrechnung, Bilan, undGeldflussrechnun) zumirgendei aufgeführte Firma. Meine Funktion ist wie folgt:
def periodic_figure_values(soup, yahoo_figure):
values = []
pattern = re.compile(yahoo_figure)
title = soup.find("strong", text=pattern) # works for the figures printed in bold
if title:
row = title.parent.parent
else:
title = soup.find("td", text=pattern) # works for any other available figure
if title:
row = title.parent
else:
sys.exit("Invalid figure '" + yahoo_figure + "' passed.")
cells = row.find_all("td")[1:] # exclude the <td> with figure name
for cell in cells:
if cell.text.strip() != yahoo_figure: # needed because some figures are indented
str_value = cell.text.strip().replace(",", "").replace("(", "-").replace(")", "")
if str_value == "-":
str_value = 0
value = int(str_value) * 1000
values.append(value)
return values
Dasyahoo_figure
ie Variable @ ist eine Zeichenfolge. Offensichtlich muss dies genau der gleiche Abbildungsname sein, wie er bei Yahoo Finance verwendet wird. @ Übergebsoup
Variable, ich benutze zuerst die folgende Funktion:
def financials_soup(ticker_symbol, statement="is", quarterly=False):
if statement == "is" or statement == "bs" or statement == "cf":
url = "https://finance.yahoo.com/q/" + statement + "?s=" + ticker_symbol
if not quarterly:
url += "&annual"
return BeautifulSoup(requests.get(url).text, "html.parser")
return sys.exit("Invalid financial statement code '" + statement + "' passed.")
Beispielnutzung - Ich möchte den Ertragsteueraufwand von Apple Inc. aus den letzten verfügbaren Gewinn- und Verlustrechnungen erhalten:
print(periodic_figure_values(financials_soup("AAPL", "is"), "Income Tax Expense"))
Ausgabe:[19121000000, 13973000000, 13118000000]
Sie könnten auch das Datum des @ bekommnde der Perio von demsoup
und erstelle ein Wörterbuch, in dem die Daten die Schlüssel und die Zahlen die Werte sind, aber dies würde diesen Beitrag zu lang machen. Soweit scheint das für mich zu funktionieren, aber ich bin immer dankbar für konstruktive Kritik.