如何用BeautifulSoup抓取HTML的dl、dd标签?StockX爬取故障求助
问题描述
尝试爬取StockX网站,目标获取12个月历史数据区域底部的波动率(Volatility)数据。目前能正常获取last_sale价格,但始终无法获取波动率数据,执行代码时会报错。
目标HTML结构:
<dl> <dt class="chakra-stat__label css-1qtnkr4">Volatility </dt> <dd class="chakra-stat__number css-jcr674">2%</dd> </dl>
使用的Python代码(last_sale可正常运行,volatility获取失败):
import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0', 'Accept-Language': 'en-US,en;q=0.5' } cookies = { 'stockx_homepage': "sneakers", } def main(url): r = requests.get(url, headers=headers, cookies=cookies) soup = BeautifulSoup(r.text, 'lxml') last_sale = soup.select('.css-xfmxd4')[0] volatility = soup.find("dd",class_="chakra-stat__number .css-jcr674") print("last sale: " + last_sale.text + "\n") print("volatility: " + volatility.text + "\n") url = "https://stockx.com/adidas-yeezy-boost-350-turtle-dove-2022?-size=11" main(url)
问题排查与解决
1. CSS选择器语法错误
你在find方法的class_参数里错误添加了.符号,导致无法匹配到目标元素。实际class属性值是chakra-stat__number css-jcr674,不需要在class名前加.。
原错误代码:
volatility = soup.find("dd",class_="chakra-stat__number .css-jcr674")
修复方案二选一:
- 修正
find方法的class参数:
volatility = soup.find("dd", class_="chakra-stat__number css-jcr674")
- 改用CSS选择器语法(和
last_sale的写法一致):
volatility = soup.select('.chakra-stat__number.css-jcr674')[0]
2. 动态加载的潜在问题
如果修复语法后仍无法获取数据,大概率是波动率数据通过JavaScript动态渲染生成的。requests仅能抓取页面初始HTML,无法执行JS加载的内容。此时可选择:
- 使用Selenium/Playwright等工具模拟浏览器,等待页面渲染完成后再抓取
- 通过浏览器开发者工具的Network面板,查找StockX的API接口,直接请求接口获取结构化数据
3. 更稳定的定位方式
StockX的动态class名(如css-jcr674)可能随时变更,建议通过文本内容关联定位,避免依赖易变的class:
# 先找到包含"Volatility"的dt标签 volatility_dt = soup.find("dt", text=lambda t: t and "Volatility" in t.strip()) if volatility_dt: # 获取相邻的dd标签 volatility = volatility_dt.find_next_sibling("dd") if volatility: print("volatility: " + volatility.text.strip() + "\n")
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

