使用requests、Selenium等常规工具无法抓取网站表格的技术求助
问题解决思路
失效根因
你当前的代码及Selenium定位失效的核心原因是:目标表格没有直接放在当前页面的DOM树中,而是嵌套在独立的<iframe>容器内。requests-html、BeautifulSoup默认只会解析父页面的源码,Selenium默认也只会操作父页面的上下文,因此都无法识别到iframe内部的元素。
适配解决方法
方法1:切换iframe上下文(Selenium方案)
使用Selenium时先定位到表格所在的iframe,再切换上下文后执行元素定位即可,示例代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("https://www.nbc4i.com/news/state-news/535-new-cases-of-covid-19-reported-in-ohio-schools-in-past-week/") # 显式等待iframe加载完成,比固定sleep更稳定 wait = WebDriverWait(driver, 10) iframe = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "iframe[src*='datawrapper']"))) # 切换到iframe上下文 driver.switch_to.frame(iframe) # 此时可以正常定位表格及内部元素 table = wait.until(EC.presence_of_element_located((By.ID, "table"))) # 后续分页、提取数据操作都在该上下文内执行即可
方法2:直接请求iframe独立地址(requests-html方案)
你可以先从父页面提取iframe的src属性值,直接请求该iframe的独立页面地址,再渲染解析内容,不需要处理父页面的其他元素,逻辑更简单。
方法3:直接拉取原始接口数据(最高效)
分页表格的内容都是通过后端接口返回的结构化数据,你可以通过浏览器开发者工具的「网络」面板,筛选XHR/Fetch类型的请求,找到表格数据的接口地址,直接请求接口获取JSON格式的原始数据,不需要解析HTML,也不用处理分页渲染逻辑,效率最高。
额外注意事项
如果请求iframe地址或数据接口时返回异常,需要补充和浏览器一致的User-Agent、Referer等请求头,必要时携带页面生成的Cookie信息,避开反爬校验。
内容的提问来源于stack exchange,提问作者azotamiota
相关产品推荐
相关产品推荐

