Selenium爬取英国超市商品价格时偶现元素选择错误求助
Asda网站商品价格爬取问题解决
核心问题分析
页面中存在多个class为co-product__price-per-uom的元素,涵盖主商品和其他推荐/关联商品的价格标签。原代码使用presence_of_element_located会返回第一个加载完成的元素,而页面异步加载顺序不固定,导致偶尔抓取到错误价格。
解决方案
1. 等待所有元素加载后取第一个(不推荐,仍有风险)
可以通过presence_of_all_elements_located等待所有匹配元素加载完成,再提取列表第一个元素,但元素列表的顺序不固定——完全由页面异步渲染速度、网络状态决定,无法保证每次都能拿到主商品价格。
修改后的代码:
# 等待所有class匹配的元素加载完成 price_elements = WebDriverWait(browser, 10).until( EC.presence_of_all_elements_located((By.CLASS_NAME, str(class_list[url_list.index(url)]))) ) # 提取第一个元素的文本 price_raw = str(price_elements[0].text)
2. 通过主商品容器精准定位(推荐)
最稳定的方式是先定位主商品的专属父容器,再在容器内查找价格元素,彻底排除其他商品的干扰。Asda的主商品通常被包裹在唯一标识的容器中(比如带有co-product__main或co-product__wrapper类的div),可通过开发者工具确认具体选择器:
示例代码:
# 先等待主商品的父容器加载完成(选择器需根据实际页面调整) main_product_container = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.co-product__wrapper")) ) # 在主容器内查找目标价格元素 price_raw = main_product_container.find_element(By.CLASS_NAME, str(class_list[url_list.index(url)])) price_raw = str(price_raw.text)
关键结论
- 可以等待所有元素加载后取第一个,但元素顺序不固定,无法保证准确性;
- 优先通过主商品的父容器定位,这是避免误抓最可靠的方法。
内容的提问来源于stack exchange,提问作者domigmr
相关产品推荐
相关产品推荐

