2016-08-30 59 views
3

我試圖從雅虎的代碼的'Key Statistics'頁面中提取信息(因爲這在Pandas圖書館中不受支持)。使用BeautifulSoup通過雅虎財經進行搜索

舉例AAPL:

from bs4 import BeautifulSoup 
import requests 

url = 'http://finance.yahoo.com/quote/AAPL/key-statistics?p=AAPL' 
page = requests.get(url) 
soup = BeautifulSoup(page.text, 'lxml') 

enterpriseValue = soup.findAll('$ENTERPRISE_VALUE', attrs={'class': 'yfnc_tablehead1'}) #HTML tag for where enterprise value is located 

print(enterpriseValue) 

編輯:感謝安迪!

問題:這是打印一個空數組。我如何將findAll更改爲598.56B

回答

5

那麼,find_all返回的列表是空的原因是因爲該數據是通過單獨的調用生成的,並不是通過向該URL發送GET請求來完成的。如果您瀏覽Chrome/Firefox上的「網絡」選項卡,並通過XHR進行篩選,通過檢查每個網絡操作的請求和響應,您可以找到您應該發送的請求URL以及您應該發送的GET請求。

在這種情況下,它是https://query2.finance.yahoo.com/v10/finance/quoteSummary/AAPL?formatted=true&crumb=8ldhetOu7RJ&lang=en-US&region=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com,因爲我們可以在這裏看到: enter image description here

那麼,我們該如何重建呢?簡單! :

from bs4 import BeautifulSoup 
import requests 

r = requests.get('https://query2.finance.yahoo.com/v10/finance/quoteSummary/AAPL?formatted=true&crumb=8ldhetOu7RJ&lang=en-US&region=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com') 
data = r.json() 

這將返回JSON響應爲dict。從那裏,瀏覽dict,直到找到你想要的數據:

financial_data = data['quoteSummary']['result'][0]['defaultKeyStatistics'] 
enterprise_value_dict = financial_data['enterpriseValue'] 
print(enterprise_value_dict) 
>>> {'fmt': '598.56B', 'raw': 598563094528, 'longFmt': '598,563,094,528'} 
print(enterprise_value_dict['fmt']) 
>>> '598.56B' 
+0

這是黃金!一般來說,我是網頁報廢新手。有沒有什麼資源可以指導我在不久的將來避免類似的問題? –

+1

查看https://automatetheboringstuff.com/chapter11/,如果您真的想深入探索,請考慮http://shop.oreilly.com/product/0636920034391.do。這是一項非常棒的技能。 – n1c9