2016-09-22 11 views
4

私はYahoo!から株価を取得しようとしていますファイナンス、Apple Inc.のように。私のコードは次のようである:クラスは動的で、私はこのWebページの後ろに生のHTMLを見たときに、問題があるこの生の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) 

(Pythonの2を使用して)、以下の図を参照してください。これにより、BeautifulSoupがタグを取得するのが難しくなります。どのようにクラスを理解し、データを取得する方法?

HTML of Yahoo! Finance page

PS:1)私はpandas_datareader.data知っているが、それは過去のデータのためです。リアルタイムの株価データが必要です。

2)私は、セレンを使用して新しいブラウザウィンドウを開くことは望ましくありません。

答えて

3

この場合、「ダイナミック」とは何を意味するのかよく分かりませんが、CSSセレクタの使用を検討しましたか? Beautifulsoupで

あなたは、このように例えば、それを得ることができます:

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を調べてください。データは、明らかにあなたは、クラス名などを使用して確実にそれを解析することはできませんreactjsを使用して移入され

+0

内容が動的であるということは、HTMLを見た場合に表示されるJavascript/reactが読み込まれることを意味します。彼らはセレクタの使い方を求めておらず、動的コンテンツをどのように解析するかを尋ねています。 –

+0

@PadraicCunningham私はしばしば代替形式(通常はいくつかのjsonからロードされた)でデータを見つけるほうがはるかに良いということに同意するが、それはデータが他の方法を使って採掘できないことを意味するものではない。タグの属性に依存しないためです。私がソースを見ていないあなたの前提は予期せぬものです。あなたは私の答えが役に立たないと思うかもしれませんし、その理由のためにそれをdownvote、他の人はそれが立つことができるように有用であることがあります。私はそれがより完全であることがわかっているので、私はあなたに反対していない、私はあなたの答えをupvotedことに注意してください。 –

+0

最初のコメントはちょうど私が意味したものです。 @Oliver W.あなたの答えは正しいです、なぜ私は 'div#quote-header-info section span'を使うのか理解できません。すべてのあなたの答えをありがとう。 – artmunich

3

..あなたはroot.App.mainスクリプトからページのソースからJSON形式ですべてのデータを取得することができます:あなたのJSONの全体の負荷を与える

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) 

は、あなたがデータを通過し、あなたが以下のように必要なものを選ぶことができます:あなたを与える

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'} 
関連する問題