Webscraping列表返回空求助:雷诺经销商页面爬取问题排查
解决爬取Renault经销商页面返回空列表的问题
我帮你分析下问题所在,以及怎么修改代码:
问题根源
你遇到的核心问题是页面内容是通过JavaScript动态渲染的(从元素的ng-binding class能看出是Angular框架)。你用requests.get()获取的是服务器返回的静态HTML,这时候经销商列表的元素还没被JS生成,所以BeautifulSoup自然找不到对应的节点。另外你同时混用了Selenium和requests,这其实没必要——既然已经用ChromeDriver加载页面,直接用它获取渲染后的页面内容就好。
修复方案
下面是调整后的代码,我标注了关键改进点:
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 url = "https://www.renault-retail-group.fr/concessions-renault.html" chrome_path = r"C:\Users\xxx\Desktop\chromedriver_win32 (1)\chromedriver.exe" driver = webdriver.Chrome(chrome_path) driver.maximize_window() try: driver.get(url) # 等待经销商列表元素加载完成,避免获取空内容 # 用更稳定的父容器选择器,代替依赖ng-binding的动态class WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CLASS_NAME, "audColResultatConcessionAdresse")) ) # 获取渲染后的页面源码 page_source = driver.page_source # 用BeautifulSoup解析渲染后的源码 from bs4 import BeautifulSoup soup = BeautifulSoup(page_source, "html.parser") g_data = soup.find_all("div", class_="audColResultatConcessionAdresse") dict_name_r = [] for item in g_data: # 直接找到h6元素,不需要用contents[1](这个索引很容易因为DOM结构变化失效) name_element = item.find("h6", class_="audColResultatConcessionNom") if name_element: # 做个空值判断,避免报错 dict_name_r.append(name_element.get_text(strip=True)) print(dict_name_r) finally: driver.quit() # 确保浏览器关闭,避免残留进程
关键改进说明
- 去掉了requests依赖:直接用Selenium获取页面渲染后的源码,这样才能拿到动态生成的经销商列表
- 增加显式等待:用
WebDriverWait等待元素加载完成,代替固定的time.sleep,更可靠也更高效 - 优化元素定位逻辑:
- 避免使用
contents[1]这种依赖DOM结构顺序的写法,改用find()直接定位目标元素 - 增加空值判断,防止因为个别元素结构异常导致代码报错
- 避免使用
- 添加
finally块:确保不管代码是否报错,浏览器都会被关闭
额外提示
如果后续遇到类似动态渲染页面的爬取需求,记住:
- 静态请求(requests)只能拿到服务器初始返回的HTML,无法获取JS加载的内容
- 优先用Selenium/Puppeteer这类工具模拟浏览器渲染,或者尝试抓包找到后台API接口(如果有的话),后者效率会更高
内容的提问来源于stack exchange,提问作者Julien Bourbon
相关产品推荐
相关产品推荐

