2017-12-10 2 views
0

Ich versuche, die total assets Werte aus den 10-K-Textdateien zu erhalten. Das Problem ist, dass das HTML-Format von Unternehmen zu Unternehmen unterschiedlich ist.So erhalten Sie einen Wert aus einem Textdokument mit einer unstrukturierten Tabelle

Nehmen Apple 10-K als Beispiel: Summe ist in einer Tabelle, die balance sheet Header und typische Begriffe wie Bargeld, Vorräte hat, ... gibt es in einigen Zeilen der Tabelle. In der letzten Zeile gibt es eine Summe von 290.479 für 2015 und 231.839 für 2014. Ich wollte die Nummer für das Jahr 2015 -> 290.479 bekommen. Ich habe nicht in der Lage gewesen, einen Weg zu finden, dass

1) die entsprechende Tabelle findet, die einige spezifische Rubriken (wie Bilanz) und Worte in Reihen (Bargeld hat, ...)

2) erhält den Wert in der Zeile, die das Wort total assets hat und zum größeren Jahr gehört (2015 für unser Beispiel).

import re 
url = 'https://www.sec.gov/Archives/edgar/data/320193/000119312515356351/d17062d10k.htm' 
r = requests.get(url) 
soup = BeautifulSoup(r.text, "xml") 
for tag in soup.find_all(text=re.compile('Total\sassets')): 
      print(tag.findParent('table').findParent('table')) 

enter image description here

Antwort

0

Mit lxml oder html.parser statt xml kann ich

title > CONSOLIDATED BALANCE SHEETS 
row > Total assets 
column 0 > Total assets 
column 1 > 
column 2 > $ 
column 3 > 290,479 
column 4 > 
column 5 > 
column 6 > $ 
column 7 > 231,839 
column 8 > 

mit Code

import requests 
from bs4 import BeautifulSoup 
import re 

url = 'https://www.sec.gov/Archives/edgar/data/320193/000119312515356351/d17062d10k.htm' 
r = requests.get(url) 
soup = BeautifulSoup(r.text, 'html.parser')# "lxml") 

# get all `b` to find title 
all_b = soup.find_all('b') 
for item in all_b: 
    # check text in every `b` 
    title = item.get_text(strip=True) 
    if title == 'CONSOLIDATED BALANCE SHEETS': 
     print('title >', title) 
     # get first `table` after `b` 
     table = item.parent.findNext('table') 
     # all rows in table 
     all_tr = table.find_all('tr') 
     for tr in all_tr: 
      # all columns in row 
      all_td = tr.find_all('td') 
      # text in first column 
      text = all_td[0].get_text(strip=True) 
      if text == 'Total assets': 
       print('row >', text) 
       for i, td in enumerate(all_td): 
        print('column', i, '>', td.get_text(strip=True)) 
erhalten
Verwandte Themen