使用BeautifulSoup提取HTML中tixStockRoe对应数值失败如何解决
问题原因
目标站点的ROE数值属于前端异步动态渲染的内容:你用requests.get拿到的只是服务端返回的初始静态HTML,此时页面还没执行JavaScript脚本去请求后端接口获取真实的ROE数据,初始HTML里对应的位置只有加载占位的loader元素,所以你没法直接从requests返回的内容里提取到数值。
解决方案
方案1:使用模拟浏览器工具(适合快速实现,不需要分析接口)
用Selenium、Playwright这类工具模拟真实浏览器的运行逻辑,等待页面JS执行完成、数据渲染完毕后再提取内容,示例代码如下:
from bs4 import BeautifulSoup as BS from selenium import webdriver from selenium.webdriver.chrome.options import Options # 引入显式等待相关依赖可替换硬编码的sleep,提升运行效率 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait # 配置无头浏览器参数 chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") driver = webdriver.Chrome(options=chrome_options) url = "https://www.bursamarketplace.com/mkt/themarket/stock/SUPM" driver.get(url) # 等待目标元素加载出非loader的文本内容,最多等10秒 wait = WebDriverWait(driver, 10) target_ele = wait.until( lambda d: d.find_element(By.CSS_SELECTOR, 'div[name="tixStockRoe"].value').text.strip() != '' ) html_content = driver.page_source soup = BS(html_content, 'lxml') val = soup.find('div', {'name': "tixStockRoe", 'class':"value"}) if val: roe_value = val.text.strip() print(roe_value) driver.quit()
方案2:直接请求异步接口(适合高性能批量抓取)
打开浏览器F12开发者工具,切换到「网络」面板,筛选XHR/fetch请求,刷新页面后找到返回ROE等股票数据的后端接口,直接构造请求调用接口拿JSON格式的返回数据,不需要解析HTML,运行效率更高。
学习资源推荐
- 入门阶段:优先看Python爬虫相关的入门实体书/在线教程,覆盖HTTP基础、requests库用法、BeautifulSoup解析逻辑即可,多做静态站点抓取的实操练习
- 进阶阶段:逐个啃对应工具的官方文档,遇到反爬、动态渲染等场景时针对性学习Selenium/Playwright、异步请求、代理池等相关技术
- 实操练习:可以从公开的信息展示类静态站点入手练习,熟练基础逻辑后再接触有反爬、动态渲染的站点
内容的提问来源于stack exchange,提问作者user16836078
相关产品推荐
相关产品推荐

