如何爬取jQuery控制的隐藏表格?bs4无法识别点击后展示的动态表格
问题原因
你用requests请求得到的只是页面首次加载的静态HTML源码,点击切换才显示的单词列表属于前端动态控制内容,分为两种情况:
- 所有表格已经全部加载到静态HTML中,只是通过CSS属性
display: none隐藏了展示状态 - 点击切换按钮时才会通过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
相关产品推荐
相关产品推荐

