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

如何从网页iframe中提取公交时刻数据?(Selenium/BeautifulSoup)

解决方案

一、Selenium 方法(解决动态加载问题)

页面公交时刻属于动态渲染内容,直接调用find_elements时元素尚未加载完成,导致返回空列表。需添加等待逻辑并确认正确选择器:

  1. 导入等待相关模块:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
  1. 修改代码,等待元素加载后提取:
# 最多等待10秒,直到目标元素出现
wait = WebDriverWait(driver, 10)
# 页面中公交时刻文本实际在class为lyr_sqResTime的<time>标签内
elements = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "lyr_sqResTime")))

times = []
for elem in elements:
    times.append(elem.text.strip())

如果仍找不到元素,需检查目标元素是否在iframe内:若存在iframe,先切换到对应iframe再执行上述逻辑:

# 替换为页面实际iframe的id或定位方式
iframe = driver.find_element(By.ID, "target-iframe-id")
driver.switch_to.frame(iframe)
# 之后执行等待和元素提取代码

二、BeautifulSoup + 直接调用API方法(更高效)

requests.get只能获取静态HTML,而公交时刻通过AJAX请求动态加载。可直接调用后端API获取数据,无需解析页面:

  1. 打开浏览器开发者工具(F12),切换到Network标签刷新页面,找到返回公交时刻的XHR接口(通常是类似https://www.capmetro.org/api/...的地址)。
  2. 模拟API请求并解析JSON:
import requests
import json

# 替换为实际找到的API接口URL
api_url = "https://www.capmetro.org/api/real-time/stop-arrivals?stopId=5866"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

response = requests.get(api_url, headers=headers)
data = json.loads(response.text)

# 根据实际JSON结构提取时刻数据
times = []
for arrival in data["arrivals"]:
    times.append(arrival["displayTime"])

这种直接获取接口数据的方式比解析HTML更稳定,且无需依赖浏览器渲染。

内容的提问来源于stack exchange,提问作者Hfhdj Hdhnf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:54:24