2016-09-22 41 views
4

我一直試圖從雅虎檢索股票價格。財務,如Apple Inc.。我的代碼是這樣的:(用Python 2)如何理解Yahoo!的原始HTML使用Python檢索數據時的財務狀況?

import requests 
from bs4 import BeautifulSoup as bs 

html='http://finance.yahoo.com/quote/AAPL/profile?p=AAPL' 
r = requests.get(html) 
soup = bs(r.text) 

問題是,當我看到這個網頁的背後原始的HTML,類是動態的,見下圖。這使得BeautifulSoup很難獲取標籤。如何理解課堂以及如何獲取數據?

HTML of Yahoo! Finance page

PS:1)我知道pandas_datareader.data,但這是歷史數據。我想要實時股票數據;

2)我不想用硒打開一個新的瀏覽器窗口。

回答

3

在這種情況下,不確定'dynamic'是什麼意思,但是您是否考慮過使用CSS選擇器?

隨着Beautifulsoup你能得到它e.g這樣的:

soup.select('div#quote-header-info section span')[0] 

而且有一些變化,你可以在模式中使用,如使用了「>」過濾器。

你可以得到相同的只有lxml,無需BeautifulSoup:

import lxml.html as html 
page = html.parse(url).getroot() 
content = page.cssselect('div#quote-header-info section > span:first-child')[0].text 

這立即說明更具體的選擇。

如果您對更高效的DOM遍歷感興趣,請研究xpaths。

+0

它們的意思是動態的,因爲在內容中加載了Javascript /如果你看過html,你會看到反應。他們不問如何使用選擇器,他們問如何解析動態內容。 –

+0

@PadraicCunningham儘管我同意以其他形式(通常從一些json加載)找到數據通常要好得多,但這並不意味着數據不能用其他方法挖掘,例如我提出的其他方法,因爲它不依賴於標籤屬性。你的假設我沒有看到源頭是冒失的。儘管您可能會發現我的答案沒有用,並因此而降低了它的效果,但其他人可能會覺得它很有用,所以我會讓它站起來。請注意,我不贊成你,因爲我發現它更完整,所以我提出了你的答案。 –

+0

第一條評論正是我的意思。 @Oliver W.你的回答是正確的,只是我不明白爲什麼使用'div#quote-header-info section span'會起作用。謝謝你的答案。 – artmunich

3

數據使用reactjs所以你將不能夠可靠地使用類名等分析呢..你可以在JSONroot.App.main腳本的網頁源文件格式中的所有數據顯然是填充:

import requests 
from bs4 import BeautifulSoup 
import re 
from json import loads 

soup = BeautifulSoup(requests.get("http://finance.yahoo.com/quote/AAPL/profile?p=AAPL").content) 
script = soup.find("script",text=re.compile("root.App.main")).text 
data = loads(re.search("root.App.main\s+=\s+(\{.*\})", script).group(1)) 
print(data) 

,讓你的JSON的整個負載,你可以通過數據,並選擇你需要的東西象下面這樣:

stores = data["context"]["dispatcher"]["stores"] 
from pprint import pprint as pp 

pp(stores[u'QuoteSummaryStore']) 

,讓你:

{u'price': {u'averageDailyVolume10Day': {u'fmt': u'63.06M', 
             u'longFmt': u'63,056,525', 
             u'raw': 63056525}, 
      u'averageDailyVolume3Month': {u'fmt': u'36.53M', 
              u'longFmt': u'36,527,196', 
              u'raw': 36527196}, 
      u'currency': u'USD', 
      u'currencySymbol': u'$', 
      u'exchange': u'NMS', 
      u'exchangeName': u'NasdaqGS', 
      u'longName': u'Apple Inc.', 
      u'marketState': u'PRE', 
      u'maxAge': 1, 
      u'openInterest': {}, 
      u'postMarketChange': {u'fmt': u'0.11', u'raw': 0.11000061}, 
      u'postMarketChangePercent': {u'fmt': u'0.10%', 
             u'raw': 0.0009687416}, 
      u'postMarketPrice': {u'fmt': u'113.66', u'raw': 113.66}, 
      u'postMarketSource': u'DELAYED', 
      u'postMarketTime': 1474502277, 
      u'preMarketChange': {u'fmt': u'0.42', u'raw': 0.41999817}, 
      u'preMarketChangePercent': {u'fmt': u'0.37%', 
             u'raw': 0.0036987949}, 
      u'preMarketPrice': {u'fmt': u'113.97', u'raw': 113.97}, 
      u'preMarketSource': u'FREE_REALTIME', 
      u'preMarketTime': 1474536411, 
      u'quoteType': u'EQUITY', 
      u'regularMarketChange': {u'fmt': u'-0.02', u'raw': -0.019996643}, 
      u'regularMarketChangePercent': {u'fmt': u'-0.02%', 
              u'raw': -0.00017607327}, 
      u'regularMarketDayHigh': {u'fmt': u'113.99', u'raw': 113.989}, 
      u'regularMarketDayLow': {u'fmt': u'112.44', u'raw': 112.441}, 
      u'regularMarketOpen': {u'fmt': u'113.82', u'raw': 113.82}, 
      u'regularMarketPreviousClose': {u'fmt': u'113.57', 
              u'raw': 113.57}, 
      u'regularMarketPrice': {u'fmt': u'113.55', u'raw': 113.55}, 
      u'regularMarketSource': u'FREE_REALTIME', 
      u'regularMarketTime': 1474488000, 
      u'regularMarketVolume': {u'fmt': u'31.57M', 
            u'longFmt': u'31,574,028.00', 
            u'raw': 31574028}, 
      u'shortName': u'Apple Inc.', 
      u'strikePrice': {}, 
      u'symbol': u'AAPL', 
      u'underlyingSymbol': None}, 
u'price,summaryDetail': {}, 
u'quoteType': {u'exchange': u'NMS', 
       u'headSymbol': None, 
       u'longName': u'Apple Inc.', 
       u'market': u'us_market', 
       u'messageBoardId': u'finmb_24937', 
       u'quoteType': u'EQUITY', 
       u'shortName': u'Apple Inc.', 
       u'symbol': u'AAPL', 
       u'underlyingExchangeSymbol': None, 
       u'underlyingSymbol': None, 
       u'uuid': u'8b10e4ae-9eeb-3684-921a-9ab27e4d87aa'}, 
u'summaryDetail': {u'ask': {u'fmt': u'114.00', u'raw': 114}, 
        u'askSize': {u'fmt': u'100', 
           u'longFmt': u'100', 
           u'raw': 100}, 
        u'averageDailyVolume10Day': {u'fmt': u'63.06M', 
               u'longFmt': u'63,056,525', 
               u'raw': 63056525}, 
        u'averageVolume': {u'fmt': u'36.53M', 
             u'longFmt': u'36,527,196', 
             u'raw': 36527196}, 
        u'averageVolume10days': {u'fmt': u'63.06M', 
              u'longFmt': u'63,056,525', 
              u'raw': 63056525}, 
        u'beta': {u'fmt': u'1.52', u'raw': 1.51744}, 
        u'bid': {u'fmt': u'113.68', u'raw': 113.68}, 
        u'bidSize': {u'fmt': u'400', 
           u'longFmt': u'400', 
           u'raw': 400}, 
        u'dayHigh': {u'fmt': u'113.99', u'raw': 113.989}, 
        u'dayLow': {u'fmt': u'112.44', u'raw': 112.441}, 
        u'dividendRate': {u'fmt': u'2.28', u'raw': 2.28}, 
        u'dividendYield': {u'fmt': u'2.01%', u'raw': 0.0201}, 
        u'exDividendDate': {u'fmt': u'2016-08-04', 
             u'raw': 1470268800}, 
        u'expireDate': {}, 
        u'fiftyDayAverage': {u'fmt': u'108.61', 
             u'raw': 108.608284}, 
        u'fiftyTwoWeekHigh': {u'fmt': u'123.82', u'raw': 123.82}, 
        u'fiftyTwoWeekLow': {u'fmt': u'89.47', u'raw': 89.47}, 
        u'fiveYearAvgDividendYield': {}, 
        u'forwardPE': {u'fmt': u'12.70', u'raw': 12.701344}, 
        u'marketCap': {u'fmt': u'611.86B', 
            u'longFmt': u'611,857,399,808', 
            u'raw': 611857399808}, 
        u'maxAge': 1, 
        u'navPrice': {}, 
        u'open': {u'fmt': u'113.82', u'raw': 113.82}, 
        u'openInterest': {}, 
        u'payoutRatio': {u'fmt': u'24.80%', u'raw': 0.248}, 
        u'previousClose': {u'fmt': u'113.57', u'raw': 113.57}, 
        u'priceToSalesTrailing12Months': {u'fmt': u'2.78', 
                 u'raw': 2.777534}, 
        u'regularMarketDayHigh': {u'fmt': u'113.99', 
               u'raw': 113.989}, 
        u'regularMarketDayLow': {u'fmt': u'112.44', 
              u'raw': 112.441}, 
        u'regularMarketOpen': {u'fmt': u'113.82', u'raw': 113.82}, 
        u'regularMarketPreviousClose': {u'fmt': u'113.57', 
                u'raw': 113.57}, 
        u'regularMarketVolume': {u'fmt': u'31.57M', 
              u'longFmt': u'31,574,028', 
              u'raw': 31574028}, 
        u'strikePrice': {}, 
        u'totalAssets': {}, 
        u'trailingAnnualDividendRate': {u'fmt': u'2.13', 
                u'raw': 2.13}, 
        u'trailingAnnualDividendYield': {u'fmt': u'1.88%', 
                u'raw': 0.018754954}, 
        u'trailingPE': {u'fmt': u'13.24', u'raw': 13.240438}, 
        u'twoHundredDayAverage': {u'fmt': u'102.39', 
               u'raw': 102.39367}, 
        u'volume': {u'fmt': u'31.57M', 
           u'longFmt': u'31,574,028', 
           u'raw': 31574028}, 
        u'yield': {}, 
        u'ytdReturn': {}}, 
u'symbol': u'AAPL'} 
相關問題