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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:22:11