Неисправность извлечения / печати значений XML / XBRL - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь очистить веб-сайт SE C для определения c тегов. Код, который у меня есть, использует как XML, так и XBRL. Я не уверен, должен ли я использовать XML или XBRL для извлечения значений из этих тегов, которые расположены на SE C. С этой проблемой я печатаю пустой список с моим кодом. В основном я sh для извлечения указанных c тегов, и я не знаю, использовать ли XML или XBRL, и как распечатать эти теги с их значениями в списке.

from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
import requests

symbol = 'AAPL'
url = "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=" + symbol + "&type=&dateb=&owner=exclude&start=0&count=100&output=atom"
uClient = uReq(url)
page_html = uClient.read()
uClient.close()
html = soup(page_html, 'html.parser')
entries = html.findAll("entry")


shouldContinue = True
link = ""
for entry in entries:

    if shouldContinue and (
            entry.find("category")["term"].lower() == "10-k" or entry.find("category")["term"].lower() == "10-q" or
            entry.find("category")["term"].lower() == "20-f"):


        firstUrl = entry.find("link")["href"]

        uClientFirstUrl = uReq(firstUrl)
        page_html_firstUrl = uClientFirstUrl.read()
        uClientFirstUrl.close()
        htmlFirstUrl = soup(page_html_firstUrl, 'html.parser')

        tds = htmlFirstUrl.findAll("table")[1].findAll("td")
        foundtd = False
        for td in tds:
            if foundtd == True:
                link = "https://www.sec.gov" + td.find("a")["href"]
                foundtd = False
            if "xbrl instance" in td.text.lower():
                foundtd = True

            shouldContinue = False


def getCash(url, symbol):
    uClient = uReq(url)
    page_html = uClient.read()
    uClient.close()
    xml = soup(page_html, 'xml')


    cash = xml.findAll("us-gaap:CashAndCashEquivalentsAtCarryingValue")
    if len(cash) == 0:
        cash = xml.findAll("ifrs-full:Cash")
        if len(cash) == 0:
            cash = xml.findAll("us-gaap:CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents")
            if len(cash) == 0:
                cash = xml.findAll("us-gaap:Cash")

    if not cash:
        print('No entries found.')

    return cash

print(getCash(url, symbol))

1 Ответ

0 голосов
/ 12 апреля 2020

Я не совсем понимаю, чего вы хотите. Давайте сначала приведем пример. Если есть проблема, давайте продолжим общаться.

from simplified_scrapy import SimplifiedDoc,req,utils

# First page
symbol = 'AAPL'
url = "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=" + symbol + "&type=&dateb=&owner=exclude&start=0&count=100&output=atom"
html = req.get(url)
doc = SimplifiedDoc(html)
links = doc.entrys.containsOr(['term="10-K"','term="10-Q"','term="20-F"']).link.href
# print (links)

# Second page
for link in links:
  html = req.get(link)
  doc = SimplifiedDoc(html)
  # lstA = doc.select('table@summary=Data Files').selects('a') # Get all links in the table
  a = doc.select('table@summary=Data Files').getElementByText('XBRL INSTANCE',tag='td').getNext('a') # Use text to locate the link
  # print (utils.absoluteUrl(link,a.href),a.text)
  u = utils.absoluteUrl(link,a.href) # Third page
  html = req.get(u)
  doc = SimplifiedDoc(html)
  cash = doc.selects('us-gaap:CashAndCashEquivalentsAtCarryingValue')
  if not cash:
    cash = doc.selects('ifrs-full:Cash')
  if not cash:
    cash = doc.selects('us-gaap:CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents')
  if not cash:
    cash = doc.selects('us-gaap:Cash')
  print (cash)

Результат:

[{'tag': 'us-gaap:CashAndCashEquivalentsAtCarryingValue', 'contextRef': 'FI2020Q1', 'decimals': '-6', 'id': 'd57642648e573-wk-Fact-B1DF26F97E6F5D2D9418D8B9DDC1DB79', 'unitRef': 'usd', 'html': '39771000000'}, 
...
...