Попытка структурировать BeautifulSoup для гибкой очистки годовых отчетов компании - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь использовать базу данных по ценным бумагам и биржам США (SE C), чтобы просматривать финансовые отчеты компании (известные как 10 КБ), чтобы получить список членов исполнительного комитета для каждой подачи. В настоящее время я использую самые последние файлы для Microsoft (биржевой тикер: MSFT) и Walmart (биржевой тикер: WMT). Я знаю, что могу найти эту информацию в другом месте на финансовых сайтах, но я пытаюсь создать гибкую базу данных для личного использования. Моя проблема:

  1. Позиция индекса таблицы различна в каждом отчете, в одном отчете компании таблица, которую я хочу, может быть таблицей 38, а в другом - таблицей 45, поэтому stati c index / Счетчик позиций не будет работать для нескольких заявок.
  2. Специфические атрибуты c в каждом теге таблицы HTML меняются, поэтому я не могу найти общий атрибут. В некоторых случаях я нахожу общие атрибуты, а иногда - нет.

Я начинаю думать, что я не смогу автоматизировать это из-за отсутствия идентификаторов, уникальных для каждого файла и общих для всех файлы. Я бился головой, просматривая множество Python уроков и видеороликов за последние несколько недель. Любые предложения приветствуются, полная автоматизация была бы идеальной, так что я мог бы пройти 1058 * через несколько заявок, частичная помощь тоже я здесь, чтобы учиться. Возможно, я пытаюсь автоматизировать что-то слишком разнообразное.

Microsoft Link:

https://www.sec.gov/Archives/edgar/data/789019/000156459019027952/msft-10k_20190630.htm

Желаемая таблица:

<table border="0" cellspacing="0" cellpadding="0" align="center" style="border-collapse:collapse; width:100%;">

Ссылка Walmart:

https://www.sec.gov/Archives/edgar/data/104169/000010416919000016/wmtform10-kx1312019.htm

Желаемая таблица:

<table cellpadding="0" cellspacing="0" style="font-family:Times New Roman;font-size:10pt;width:100%;border-collapse:collapse;text-align:left;">

Код для подсчета Количество таблиц на каждой странице:

from selenium import webdriver
from bs4 import BeautifulSoup

chrome_path = r"C:\webdrivers\chromedriver.exe"
browser = webdriver.Chrome(chrome_path)

#Microsoft
browser.get("https://www.sec.gov/Archives/edgar/data/789019/000156459019027952/msft-10k_20190630.htm")
msft = browser.page_source
page_msft = BeautifulSoup(msft, 'html.parser')
tables_msft = page_msft.find_all("table")

#Walmart
browser.get("https://www.sec.gov/Archives/edgar/data/104169/000010416919000016/wmtform10-kx1312019.htm")
wmt = browser.page_source
page_wmt = BeautifulSoup(wmt, 'html.parser')
tables_wmt = page_wmt.find_all("table")

print("MSFT Result Table Count: " + str(len(tables_msft)))
print("Walmart Result Table Count: " + str(len(tables_wmt)))

Результаты:

Таблица результатов MSFT: 263

Таблица результатов Walmart: 258

Процесс завершен с кодом выхода 0

1 Ответ

2 голосов
/ 16 марта 2020

Во-первых, вам не нужен Selenium, библиотека запросов будет работать быстрее и избежать лишних затрат. Таким образом, я смог частично найти способ извлечь необходимые данные. Но поскольку количество столбцов различно, их нельзя объединять (для Microsoft и Walmart). Приведенный ниже код генерирует два необходимых фрейма данных, один для Microsoft и один для Walmart. Вам все еще нужно манипулировать именами столбцов. Идея состоит в том, чтобы получить таблицу со значением td как 'Age', поскольку это уникальные данные таблицы. Дайте мне знать, если вам нужны пояснения: -

from bs4 import BeautifulSoup
import requests
import pandas as pd
import numpy as np


#Microsoft
page = requests.get("https://www.sec.gov/Archives/edgar/data/789019/000156459019027952/msft-10k_20190630.htm")
soup = BeautifulSoup(page.text, 'html')
resmsft = []
tables_msft = soup.find(text="Age").find_parent("table")
for row in tables_msft.find_all("tr")[1:]:
#    print([cell.get_text(strip=True) for cell in row.find_all("td")])
    if row:
        resmsft.append([cell.get_text(strip=True) for cell in row.find_all("td")])

non_empty = [sublist for sublist in resmsft if any(sublist)]
df_msft = pd.DataFrame.from_records(non_empty)
df_msft[df_msft==''] = np.nan 
df_msft=df_msft.dropna(axis=1,how='all')


#Walmart
page = requests.get("https://www.sec.gov/Archives/edgar/data/104169/000010416919000016/wmtform10-kx1312019.htm")
soup = BeautifulSoup(page.text, 'html')
#page_wmt = BeautifulSoup(soup, 'html.parser')
tables_wmt = soup.find(text="Age").find_parent("table")
reswmt = []
for row in tables_wmt.find_all("tr")[1:]:
#    print([cell.get_text(strip=True) for cell in row.find_all("td")])
    if row:
        reswmt.append([cell.get_text(strip=True) for cell in row.find_all("td")])
non_empty_wmt = [sublist for sublist in reswmt if any(sublist)]
df_wmt = pd.DataFrame.from_records(non_empty_wmt)
df_wmt[df_wmt==''] = np.nan 
df_wmt=df_wmt.dropna(axis=1,how='all')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...