Python爬取ArcGIS网页表格失败:无法定位表格元素求助
解决动态页面表格爬取问题
你的问题根源在于目标页面是动态渲染的:用requests获取的只是初始HTML框架,表格数据是通过JavaScript异步调用后端接口加载的,初始HTML里根本没有esri-feature-table__content元素,所以BeautifulSoup找不到任何内容。
下面提供两种可行的解决方案:
方案1:用Selenium模拟浏览器加载动态内容
Selenium会启动真实浏览器,等待页面完全渲染后再抓取内容,适合处理复杂动态页面。
步骤:
- 安装依赖:
pip install selenium pandas
- 下载对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配),并配置到系统路径或代码指定路径。
代码示例:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from bs4 import BeautifulSoup import pandas as pd # 初始化Chrome浏览器驱动(如果驱动不在系统路径,需指定executable_path参数) driver = webdriver.Chrome() driver.get("https://experience.arcgis.com/experience/76b68b923a094fb5a2d193ace5ccb975/") # 等待表格容器加载完成(最多等待10秒) wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.ID, "esri-feature-table__content"))) # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") # 提取表格并转为DataFrame table = soup.find(id="esri-feature-table__content").find("table") df = pd.read_html(str(table))[0] print(df) # 关闭浏览器 driver.quit()
方案2:直接抓取后端API接口
动态页面的表格数据通常来自后端的API接口,直接请求接口获取数据效率更高,无需模拟浏览器。
步骤:
- 打开浏览器开发者工具(F12),切换到「Network」标签,刷新页面。
- 在XHR/Fetch请求列表中,查找返回表格数据的接口(通常是包含
query、FeatureServer等关键词的请求,返回JSON格式数据)。 - 复制该接口的URL,直接用
requests请求并解析数据。
代码示例(以找到的API接口为例):
import requests import pandas as pd # 替换为你找到的实际API接口URL api_url = "https://services.arcgis.com/.../FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=false&f=json" # 发送请求获取JSON数据 response = requests.get(api_url) data = response.json() # 提取属性数据并转为DataFrame df = pd.DataFrame([item["attributes"] for item in data["features"]]) print(df)
两种方案对比
- Selenium:通用性强,无需分析接口,适合所有动态页面,但速度较慢,需要依赖浏览器和驱动。
- API抓取:速度快、效率高,但需要手动分析接口,部分接口可能有签名或权限验证。
内容的提问来源于stack exchange,提问作者Jared Greathouse
相关产品推荐
相关产品推荐

