You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何爬取jQuery控制的隐藏表格?bs4无法识别点击后展示的动态表格

问题原因

你用requests请求得到的只是页面首次加载的静态HTML源码,点击切换才显示的单词列表属于前端动态控制内容,分为两种情况:

  1. 所有表格已经全部加载到静态HTML中,只是通过CSS属性display: none隐藏了展示状态
  2. 点击切换按钮时才会通过JS异步请求对应列表的数据,再渲染到页面中
    你当前的代码只取了find_all结果的第一个元素,就算其他表格已经在静态源码中,也会被你过滤掉。
解决方法

方案1:优先检查静态源码是否包含所有表格

直接打印requests.get拿到的完整响应文本,搜索其他列表里的已知单词,如果能搜到,说明所有表格都在静态源码中,仅需修改你的原有代码即可:

import requests
from bs4 import BeautifulSoup

root = "https://www.graduateshotline.com/gre-word-list.html"
content = requests.get(root).text
soup = BeautifulSoup(content,'html.parser')
# 获取所有符合类名的表格,不要只取第一个
all_tables = soup.find_all('table',attrs={'class':'tablex border1'})
for index, table in enumerate(all_tables):
    print(f"===== 第{index+1}份单词表 =====")
    print(table)

方案2:静态源码无隐藏表格时的处理

如果搜索不到其他列表的内容,说明数据是点击后才异步加载的,有两种常用处理方式:

  • 抓异步接口:打开浏览器开发者工具的「网络」面板,筛选「XHR/ fetch」类型的请求,点击切换列表时观察新增的请求,直接用requests调用该接口获取数据,该方法效率最高。
  • 用Selenium模拟浏览器操作:通过模拟真实浏览器的点击行为,等待JS渲染完成后再提取页面内容,示例代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from bs4 import BeautifulSoup

# 需提前安装对应浏览器版本的驱动,这里以Chrome为例
driver = webdriver.Chrome()
driver.get("https://www.graduateshotline.com/gre-word-list.html")

# 找到所有列表切换按钮,依次点击触发内容加载
switch_btns = driver.find_elements(By.CSS_SELECTOR, "你替换成实际的按钮选择器") # 可在开发者工具中右键对应按钮复制选择器
for btn in switch_btns:
    btn.click()
    time.sleep(1) # 等待内容加载完成

# 获取渲染完成的完整页面源码
full_page = driver.page_source
soup = BeautifulSoup(full_page, 'html.parser')
all_tables = soup.find_all('table',attrs={'class':'tablex border1'})
for table in all_tables:
    print(table)

driver.quit()

注意:你需要提前安装和本地浏览器版本匹配的驱动,同时执行pip install selenium安装依赖库才能正常运行上述代码

内容的提问来源于stack exchange,提问作者Vedank Pande

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 17:27:03