Есть ли лучший способ извлечь SIC и конец финансового года с этой веб-страницы? - PullRequest
0 голосов
/ 03 февраля 2019

Вот ссылка: https://www.sec.gov/cgi-bin/browse-edgar?CIK=20&owner=exclude&action=getcompany&Find=Search

Я хочу извлечь SIC (т. Е. 3823) и конец года (т. Е. 0102).Мой код выглядит следующим образом.Это работает, но я чувствую, что это громоздко.Какой способ лучше?Благодарю.

#soup is a BeatutifulSoup soup object

link_tags = soup.find_all("a")
if link_tags:
    for link in link_tags:

        if "SIC=" in link.get("href"):
            sic = link.string.strip()


re_yend = re.compile(r"Fiscal Year End: *(\d{4})")
match = re_yend.search(str(soup))
if match:
    y_end = str(match.group(1))

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Вот еще один способ получить данные с сайта:

import re
import requests
from bs4 import BeautifulSoup as bs


def get_data(url):
    response = requests.get(url)
    if response.status_code != 200:
        raise ValueError('Cannot read the data')
    return response.text


def get_sic_fiscal(data):
    soup = bs(data, 'html.parser')
    # Get the compagny info block
    company_info = soup.find('div', {'class': 'companyInfo'})
    # Get the acronym tag
    acronym = company_info.find('acronym', {'title': 'Standard Industrial Code'})
    # find the next url to acronym tag
    sic = acronym.findNext('a')
    # Reduce the search of the fiscal year end only
    # in the compagny info block
    fiscal_year_end = re.search(r'Fiscal Year End:\s+(\d+)', company_info.text)
    if fiscal_year_end:
        return sic.text, fiscal_year_end.group(1)
    return sic.text, None



url = 'https://www.sec.gov/cgi-bin/browse-edgar?CIK=20&owner=exclude&action=getcompany&Find=Search'

data = get_data(url)
sic, fiscal = get_sic_fiscal(data)

print('SIC: {sic} and Fiscal year end: {fiscal}'.format(sic=sic, fiscal=fiscal))

Вывод:

SIC: 3823 and Fiscal year end: 0102
0 голосов
/ 03 февраля 2019

Вы можете значительно упростить поиск SIC с помощью селектора CSS, который ищет SIC в href.Ваш подход к поиску финансового года довольно хорош, хотя нет необходимости явно компилировать регулярное выражение, и если вы знаете, что данные всегда будут там, вы также можете исключить проверку соответствия:

print(soup.select_one('.identInfo a[href*="SIC"]').text)
print(re.search(r"Fiscal Year End: *(\d+)", soup.text).group(1))

Результат:

3823
0102
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...