使用BeautifulSoup查找特定span元素 爬取Udemy课程价格遇定位难题
无法抓取元素的核心原因
你找不到目标span和元素嵌套层级无关,Udemy的课程价格是通过JavaScript动态渲染到页面的,你用requests.get()拿到的只是服务端返回的初始静态HTML,这部分内容里根本没有价格相关的span元素,所以全页搜索也找不到对应内容。
可行解决方案
- 方案一:使用支持动态页面渲染的工具
可以用Selenium、Playwright这类模拟浏览器运行的工具,等待页面JS执行完成、元素渲染出来后再定位抓取,参考代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 配置无头浏览器,不需要弹出窗口 chrome_opt = Options() chrome_opt.add_argument("--headless=new") chrome_opt.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=chrome_opt) target_url = "你的目标课程链接" driver.get(target_url) try: # 最多等待10秒,直到目标价格元素加载完成 price_ele = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".ud-clp-price-text span span")) ) print(f"当前课程价格:{price_ele.text.strip()}") finally: driver.quit()
注:尽量不要用带随机后缀的类名(比如原方案里的--17KRp、--3xxeM)定位,这类类名是前端打包自动生成的,会不定期更新导致定位失效,优先用Udemy官方固定前缀的类名或者元素属性、文本特征定位。
- 方案二:直接调用数据接口
你可以在浏览器开发者工具的「网络」面板里过滤XHR/ Fetch请求,找到Udemy返回课程价格的公开API接口,直接请求接口获取JSON格式的价格数据,不需要解析DOM,运行效率和稳定性都更高。
额外注意事项
- 发起请求时要带上正常的User-Agent等请求头,避免被Udemy的反爬策略拦截
- 不要高频发起请求,避免触发访问限制
内容的提问来源于stack exchange,提问作者MatanBitton
相关产品推荐
相关产品推荐

