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
相关产品推荐
相关产品推荐

