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

Python爬虫无法抓取深层嵌套标签,获取门店地址与电话失败

问题原因

  • 存在冗余导入:你重复引入了两次requests库,属于无意义代码
  • 元素匹配规则错误:aria-label是HTML元素的属性名,不是class类名,你当前的查找逻辑完全匹配不到目标元素
  • 核心问题:该网站的门店列表是前端JS动态渲染生成的,直接发送GET请求拿到的静态HTML里根本没有加载完成的门店数据,所以解析后返回空列表是正常现象

调整方案

新手优先推荐用模拟浏览器渲染的方式获取完整页面内容,门槛更低好调试:

第一步:安装依赖

运行以下命令安装需要的库:

pip install selenium webdriver-manager beautifulsoup4

第二步:调整代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import time

# 自动配置Chrome驱动,不用手动下载
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 访问门店页面
driver.get('https://www.orangetheory.com/en-us/locations/')
# 等待页面动态加载,网络不好可以把3改成5或者更长
time.sleep(3)

# 拿到渲染完成的完整页面源码
page_source = driver.page_source
soup = BeautifulSoup(page_source, "html.parser")

# 这里的class需要你自己在浏览器F12开发者工具里核对实际值:打开网页按F12,点左上角的元素选择箭头,点一下门店卡片就能看到对应元素的class
store_cards = soup.find_all(attrs={'class': 'location-card'})
for card in store_cards:
    # 同样替换成你查到的地址对应的class
    address = card.find(attrs={'class': 'address'}).get_text(strip=True) if card.find(attrs={'class': 'address'}) else '无地址信息'
    # 替换成你查到的电话对应的class
    phone = card.find(attrs={'class': 'phone'}).get_text(strip=True) if card.find(attrs={'class': 'phone'}) else '无联系电话'
    print(f"门店地址:{address},联系电话:{phone}")

# 爬取完成后关闭浏览器
driver.quit()

如果你想要更高的爬取效率,可以在浏览器「网络」面板里筛选XHR/fetch请求,找到站点加载门店数据的后端接口,直接请求接口就能拿到结构化的JSON数据,不需要解析HTML,不过这个方法需要你分析接口的请求参数,有一点学习成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:57:00