如何用Beautiful Soup筛选特定Symbol的期权Bid/Ask价格?
筛选特定期权条目并提取报价
问题分析
你之前的代码无法找到目标条目,核心问题有两个:一是symbol并非<tr>元素的直接属性,而是嵌套在<tr>的data-row属性的JSON数据中;二是你错误地在<tr>内部查找子<tr>元素,不符合页面DOM结构。
解决方案
方法1:解析data-row中的JSON数据(推荐)
每个<tr>的data-row属性存储了完整的期权结构化数据,解析该JSON可直接定位目标symbol并提取报价:
import requests import json from bs4 import BeautifulSoup page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') results = soup.find_all('tr', {'class':"parent"}) target_symbol = "BTCC 250117C5.00" for result in results: # 解析data-row属性为JSON对象 data_row = json.loads(result['data-row']) # 检查call期权是否匹配目标symbol if data_row['call']['symbol'] == target_symbol: bid_price = data_row['call']['bid_price'] ask_price = data_row['call']['ask_price'] print(f"目标期权bid价: {bid_price}, ask价: {ask_price}") break # 检查put期权是否匹配目标symbol elif data_row['put']['symbol'] == target_symbol: bid_price = data_row['put']['bid_price'] ask_price = data_row['put']['ask_price'] print(f"目标期权bid价: {bid_price}, ask价: {ask_price}") break
方法2:从DOM元素中直接提取
如果不想解析JSON,也可以通过<td>的类名直接定位报价,但需要先确认目标symbol对应的期权类型:
import requests import json from bs4 import BeautifulSoup page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') results = soup.find_all('tr', {'class':"parent"}) target_symbol = "BTCC 250117C5.00" for result in results: data_row = json.loads(result['data-row']) # 确认当前tr包含目标symbol后提取对应td内容 if data_row['call']['symbol'] == target_symbol: bid_price = result.find('td', class_='call bid_price').text.strip() ask_price = result.find('td', class_='call ask_price').text.strip() print(f"目标期权bid价: {bid_price}, ask价: {ask_price}") break elif data_row['put']['symbol'] == target_symbol: bid_price = result.find('td', class_='put bid_price').text.strip() ask_price = result.find('td', class_='put ask_price').text.strip() print(f"目标期权bid价: {bid_price}, ask价: {ask_price}") break
关键提示
data-row中的JSON包含了所有标准化数据,解析后直接提取字段比遍历DOM元素更高效、更不易受页面结构变化影响。- 目标symbol可能属于call(认购)或put(认沽)期权,需分别检查两种类型。
内容的提问来源于stack exchange,提问作者Les
相关产品推荐
相关产品推荐

