使用Selenium获取亚马逊商品价格:a-offscreen返回None求助
问题分析与解决
为什么首次定位返回空值?
a-offscreen类元素是亚马逊的隐藏元素(通常带有display: none样式),Selenium的.text属性仅返回页面可见元素的文本,对隐藏元素会返回空字符串(你看到的None是处理时的表现)。而BeautifulSoup直接解析HTML源码,不判断元素可见性,所以能提取到内容。- 不同商品的价格DOM结构存在差异,第一个商品的可见价格元素并不是
a-offscreen,而是其他关联元素。
正确获取价格的两种方案
方案1:直接提取隐藏元素的内容
针对a-offscreen这类隐藏元素,跳过.text,直接获取元素的属性值:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By url = "https://www.amazon.in/Celevida-Kesar-Elaichi-Flavor-Metal/dp/B081WJ6536/ref=sr_1_5?crid=3NRZERQ8H4T8L&keywords=dr+reddys+celevida&qid=1672124472&sprefix=%2Caps%2C5801&sr=8-5" services = Service(r"C:\Users\Deepak Shetter\chromedriver_win32\chromedriver.exe") driver = webdriver.Chrome(service=services) driver.get(url) price = driver.find_element(By.CLASS_NAME, "a-offscreen") # 获取元素的文本内容属性 price_text = price.get_attribute("textContent").strip() print("price is", price_text) driver.quit()
方案2:定位可见的价格元素(更可靠)
直接定位页面上显示的价格元素,同时加入显式等待避免页面加载延迟问题:
from selenium import webdriver from selenium.webdriver.chrome.service import Service 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.amazon.in/Celevida-Kesar-Elaichi-Flavor-Metal/dp/B081WJ6536/ref=sr_1_5?crid=3NRZERQ8H4T8L&keywords=dr+reddys+celevida&qid=1672124472&sprefix=%2Caps%2C5801&sr=8-5" services = Service(r"C:\Users\Deepak Shetter\chromedriver_win32\chromedriver.exe") driver = webdriver.Chrome(service=services) driver.get(url) # 等待价格容器加载完成,超时时间10秒 price_container = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "a-price")) ) # 获取整数部分和小数部分 price_whole = price_container.find_element(By.CLASS_NAME, "a-price-whole").text price_fraction = price_container.find_element(By.CLASS_NAME, "a-price-fraction").text full_price = f"{price_whole}.{price_fraction}" print("price is", full_price) driver.quit()
关键注意点
- 显式等待:亚马逊页面加载存在动态渲染,直接定位元素容易失败,用
WebDriverWait等待元素出现后再操作,比time.sleep()更高效稳定。 - 避免依赖单一class:亚马逊的DOM结构可能调整,通过容器层级定位(如从
a-price下找子元素)能提升代码兼容性。
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

