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

使用Selenium爬取生鲜产品数据时价格为空的原因及解决方法

Selenium爬取生鲜产品价格为空的原因及解决办法

问题描述

我用Python的Selenium库爬取生鲜产品数据时,成功拿到产品名称“USDA INSPECTED BEEF RIBEYE STEAK*”,但获取到的产品价格为空(实际页面显示价格是$9.98,对应页面元素为<span class="price__value">$9.98</span>)。以下是我的代码:

import pandas as pd
from selenium import webdriver
import time
from selenium.webdriver.common.by import By


# Navigate to the wholefood product page
driver = webdriver.Chrome('/full/path/to/chromedriver')
url = 'https://wildforkfoods.com/products/usda-inspected-beef-ribeye-steak?region_id=990300&gclid=CjwKCAjwoIqhBhAGEiwArXT7K5X1qBn9wREml7UC643CTfsmyPI5ctxRMzRe3FA2To7CddZf43dnCBoC7lYQAvD_BwE&variant=9385081438244'
driver.get(url)

# Wait for the page to load
time.sleep(5)

# Extract the relevant product data
product_name = driver.find_element(By.XPATH, '//h1[text()="USDA Inspected Beef Ribeye Steak*"]')
product_price = driver.find_element(By.XPATH, '//span[@class="price__value"]')


# Print the product data
print('Product Name:', product_name.text)
print('Product Price:', product_price.text)

data = {'Product Name': [product_name.text], 'Product Price': [product_price.text]}
df = pd.DataFrame(data)

# Save the data to a csv file
df.to_csv('product_data.csv', index=False)

# Close the browser window
driver.quit()

价格为空的原因

  • 固定等待不可靠:time.sleep(5)是固定时长等待,可能页面整体加载完成,但价格是通过异步接口获取后渲染的,这时元素虽然存在,但文本还没填充,导致.text返回空。
  • 元素定位不精确:页面中可能存在多个class="price__value"的元素,第一个匹配到的是隐藏的占位元素,本身没有文本内容。
  • 元素未完全渲染:价格元素可能处于不可见状态(比如CSS隐藏),直接调用.text会返回空(Selenium的.text只返回可见元素的文本)。

改进方案

1. 用显式等待替代固定等待

显式等待会等待元素满足指定条件(比如可见、文本存在)后再执行操作,比固定等待更可靠。

首先需要导入相关模块:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

然后替换原代码中的等待和元素获取部分:

# 替换time.sleep(5)
wait = WebDriverWait(driver, 10)  # 最多等待10秒

# 等待产品名称可见
product_name = wait.until(EC.visibility_of_element_located((By.XPATH, '//h1[text()="USDA Inspected Beef Ribeye Steak*"]')))

# 等待价格元素可见且包含$符号(确保文本已加载)
wait.until(EC.text_to_be_present_in_element((By.XPATH, '//span[@class="price__value"]'), '$'))
product_price = driver.find_element(By.XPATH, '//span[@class="price__value"]')

2. 优化元素定位精度

检查页面DOM结构,给价格元素的XPATH加上父容器限制,避免匹配到无关元素。比如如果价格在.product-pricing容器内,可以写成:

product_price = wait.until(EC.visibility_of_element_located((By.XPATH, '//div[contains(@class, "product-pricing")]//span[@class="price__value"]')))

3. 直接获取元素属性

如果元素文本存在但.text拿不到,可以尝试获取元素的innerHTML或textContent属性:

product_price_text = product_price.get_attribute('innerHTML')
# 或者
product_price_text = product_price.get_attribute('textContent')

完整改进后代码

import pandas as pd
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


# 初始化浏览器
driver = webdriver.Chrome('/full/path/to/chromedriver')
url = 'https://wildforkfoods.com/products/usda-inspected-beef-ribeye-steak?region_id=990300&gclid=CjwKCAjwoIqhBhAGEiwArXT7K5X1qBn9wREml7UC643CTfsmyPI5ctxRMzRe3FA2To7CddZf43dnCBoC7lYQAvD_BwE&variant=9385081438244'
driver.get(url)

# 显式等待元素加载
wait = WebDriverWait(driver, 10)
product_name = wait.until(EC.visibility_of_element_located((By.XPATH, '//h1[text()="USDA Inspected Beef Ribeye Steak*"]')))
# 等待价格文本加载完成
wait.until(EC.text_to_be_present_in_element((By.XPATH, '//span[@class="price__value"]'), '$'))
product_price = driver.find_element(By.XPATH, '//span[@class="price__value"]')

# 获取数据
product_name_text = product_name.text
product_price_text = product_price.text

print('Product Name:', product_name_text)
print('Product Price:', product_price_text)

# 保存到CSV
data = {'Product Name': [product_name_text], 'Product Price': [product_price_text]}
df = pd.DataFrame(data)
df.to_csv('product_data.csv', index=False)

# 关闭浏览器
driver.quit()

内容的提问来源于stack exchange,提问作者yutong jin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:17:28