首页 > 解决方案 > 使用 BeautifulSoup 从 yahoo Finance 抓取期权价格并找到

问题描述

我正在构建一个 MS Excel 文档以从 Yahoo Finance、ariva 等获取股票和期权价格。我正在使用 xlwings 和 BeautifulSoup 来获取数据。

一切正常,我从雅虎获得股票价格,我还从 ariva 直接获得股票/德国期权价格到 Excel。不幸的是,期权价格(不是股票价格)更难获得。

我正在使用此代码(例如,股票代码是“NVDA”,日期是“44211”(2021 年 15 月 1 日),option_name 是“NVDA210115C00210000”):

import xlwings as xw
import bs4 as bs
import requests 

@xw.func
def get_stock(ticker,date,option_name):
    url_base = 'http://finance.yahoo.com/quote/'
    new_date = str(86400*(date-25569))
    src_base = requests.get(url_base+ticker+'/options?date='+new_date).text
    soup = bs.BeautifulSoup(src_base,'lxml')

这导致加载https://finance.yahoo.com/quote/NVDA/options?date=1610668800(工作正常)。

我如何获得此选项的选项价格:NVDA210115C00210000?我试过了:

    price = soup.find_all('div',attrs={'id':'Col1-1-OptionContracts-Proxy'})[0].find(attrs={'class':'data-col2'}).get_text()

    return[price]

但它只返回此页面上第一个选项的价格。

见图:雅虎财经代码和期权价格我要的是324,37。

不知何故,我必须找到“NVDA210115C00210000”的位置,然后获取 data-col2 的文本。两天前我刚开始使用 Python,我不是程序员,但我认为这应该不难。

我如何使用“查找”来找到那个地方然后得到价格?

标签: pythonbeautifulsoupfindxlwings

解决方案


You have many errors,

    soup = bs.BeautifulSoup(src_base,'lxml')

should be:

    soup = bs.BeautifulSoup(src_base.content,'lxml')

It's .content you are missing.

What I done was instead find the the table row: table_data = soup.find('tr',{'data-reactid':'200'}) then found the data in that row option_price = table_data.find('td', {'data-reactid':'206'}).text

def get_stock(ticker,date,option_name):
    url_base = 'http://finance.yahoo.com/quote/'
    new_date = str(86400*(date-25569))
    src_base = requests.get(url_base+ticker+'/options?date='+new_date)
    soup = bs.BeautifulSoup(src_base.content,'lxml')

    table_data = soup.find('tr',{'data-reactid':'200'})
    option_price = table_data.find('td', {'data-reactid':'206'}).text

    print(option_price)

get_stock('NVDA',44211,'NVDA210115C00210000')

>>> 407.35

HTML Code

<tr class="data-row7 Bgc($hoverBgColor):h BdT Bdc($seperatorColor) H(33px) in-the-money Bgc($hoverBgColor)" data-reactid="200">
 <td class="data-col3 Ta(end) Pstart(7px)" data-reactid="206">407.35</td>


推荐阅读