2016-08-30 3 views
3

Я пытаюсь извлечь информацию со страницы «Статистика ключей» для тикера в Yahoo (так как это не поддерживается в библиотеке Pandas).Использование BeautifulSoup для поиска через Yahoo Finance

Пример 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) 

Edit: благодаря Энди!

Вопрос: Это печать пустого массива. Как мне изменить findAll, чтобы вернуть 598.56B?

ответ

5

Ну, причина, по которой список, который возвращает find_all, пуст, заключается в том, что эти данные генерируются с помощью отдельного вызова, который не завершен, просто отправив запрос GET на этот URL. Если вы просматриваете вкладку «Сеть» в 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

Смежные вопросы