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_figureie 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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage