BeautifulSoup查找css-开头类的div返回空数组,求解决方案
解决BeautifulSoup无法找到动态加载元素的问题
先确认静态源码里有没有目标元素
requests.get只能拿到服务器返回的静态HTML,如果目标元素是JavaScript动态生成的,静态源码里根本找不到。先把请求到的源码存到本地看看:
requester = requests.get("https://...").text # 保存源码到本地文件 with open("page_source.html", "w", encoding="utf-8") as f: f.write(requester)
打开生成的page_source.html,搜索css-1ksc682或者data-cy="ws-run-btn",要是搜不到,就说明元素是动态加载的,得换方法。
方案一:用Selenium模拟浏览器获取渲染后页面
Selenium会启动真实浏览器,执行页面里的JavaScript,能拿到完全渲染后的页面内容:
from selenium import webdriver from selenium.webdriver.common.by import By from bs4 import BeautifulSoup import time # 初始化Chrome浏览器(需要提前安装对应版本的chromedriver) driver = webdriver.Chrome() driver.get("https://...") # 等页面加载完成,根据实际情况调整等待时间,也可以用显式等待更精准 time.sleep(3) # 获取渲染后的完整源码 page_source = driver.page_source driver.quit() # 再用BeautifulSoup解析 hsource = BeautifulSoup(page_source, 'lxml') nono = hsource.find_all("div", {"class": 'css-1ksc682'}) print(nono)
也可以直接用Selenium自带的查找方法,不用BeautifulSoup:
# 通过class查找 elements = driver.find_elements(By.CLASS_NAME, "css-1ksc682") # 通过data-cy属性查找 elements = driver.find_elements(By.CSS_SELECTOR, '[data-cy="ws-run-btn"]')
方案二:直接调用后端API接口
打开浏览器开发者工具(F12),切换到「Network」标签页,刷新页面后筛选「XHR/Fetch」请求,找到返回目标元素对应数据的接口,直接用requests请求这个接口拿数据,这种方法比Selenium更高效,不需要启动浏览器:
import requests # 替换成实际找到的API接口地址 api_url = "https://.../api/xxx" response = requests.get(api_url) data = response.json() # 从返回的JSON数据里提取你需要的内容
内容的提问来源于stack exchange,提问作者Sobolev Roman
相关产品推荐
相关产品推荐

