使用Selenium+pd.read_html爬取ArcGIS网页表格报No tables found错误如何解决
ValueError: No tables found 错误排查解决方案
- 第一步:添加页面加载等待
你当前的代码在执行driver.get()后立即抓取页面源码,而ArcGIS平台的表格属于异步渲染的动态内容,触发请求到完全渲染需要一定时间,此时页面还未生成表格结构就被抓取,自然会识别不到。
可以先添加强制等待测试效果,正式环境建议使用Selenium的显式等待,定位到表格元素后再执行后续操作,参考测试代码:import pandas as pd import time 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(executable_path=r"C:\chromedriver_win32\chromedriver.exe") driver.get("https://geosaurus.maps.arcgis.com/home/item.html?id=adaead8cb3174ac6a89f0c14ae70aadd&view=list&sortOrder=desc&sortField=defaultFSOrder#data") # 先加10秒强制等待测试 time.sleep(10) # 显式等待写法(性能更稳定,推荐替换上面的time.sleep): # WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.TAG_NAME, "table"))) html = driver.page_source tables = pd.read_html(html) print(tables) - 第二步:检查表格是否嵌套在iframe中
ArcGIS平台常将数据内容放在独立的iframe中,当前页面的源码默认不包含iframe内的内容,需要先切换到对应iframe再抓取源码:
你可以在浏览器F12控制台中搜索表格的父级元素是否为<iframe>标签,如果是,添加切换iframe的代码即可:# 先定位iframe元素,可根据id、class等属性调整选择器,以下为示例 iframe = driver.find_element(By.CSS_SELECTOR, "iframe.表格对应的iframe选择器") driver.switch_to.frame(iframe) # 切换完成后再抓取源码 html = driver.page_source - 第三步:确认表格是否为标准结构
<div><table>、<tr>、<td>pd.read_html()内容的提问来源于stack exchange,提问作者Harry Peng
部分前端实现会用标签模拟表格样式,这类伪表格没有等标准表格标签,无法识别,需要你自行通过Selenium定位行、列元素,逐行提取内容后手动拼接成DataFrame。
相关产品推荐
相关产品推荐

