如何用Selenium和Python提取网页中的原价与折扣价
解决商品原价与折扣价提取问题
问题根源
你当前的代码全局匹配所有含price/cost类的span,会把页面中推荐商品的价格也捞进来,而且没有区分原价和折扣价的逻辑,导致结果不符合预期。
通用解决方案思路
- 缩小搜索范围:先定位当前商品的主价格区域(而非全局搜索),详情页的主价格通常包裹在专属容器中(比如class含
product-main-price、single-product-price的元素)。 - 区分原价与折扣价的特征:
- 原价:常带有删除线样式,class名包含
old、original、strike,或被<del>/<s>标签包裹 - 折扣价:class名包含
new、discounted、sale,或字体样式更突出(比如更大字号、特殊颜色)
- 原价:常带有删除线样式,class名包含
- 数字清洗标准化:提取文本后统一转换为阿拉伯数字,过滤非数字字符。
修正后的代码示例
html = driver.page_source soup = BeautifulSoup(html, "html.parser") # 先定位当前商品的主价格容器(根据页面结构调整,示例页面可匹配含product-price的容器) main_price_container = soup.find('div', class_=re.compile(r'product-price|single-price')) if not main_price_container: print("未找到主价格容器") else: # 提取原价:匹配带删除线或old/original类的元素 original_price_elem = main_price_container.find(['del', 's'], class_=re.compile(r'old|original')) or main_price_container.find('span', class_=re.compile(r'old|original')) original_price = "" if original_price_elem: original_price_text = convert_numbers.persian_to_english(original_price_elem.text.strip()) original_price = re.sub(r'\D', '', original_price_text) print(f"原价: {original_price}") # 提取折扣价:匹配new/discounted/sale类或核心price类的元素 discounted_price_elem = main_price_container.find('span', class_=re.compile(r'new|discounted|sale')) or main_price_container.find('span', class_=re.compile(r'price')) discounted_price = "" if discounted_price_elem: discounted_price_text = convert_numbers.persian_to_english(discounted_price_elem.text.strip()) discounted_price = re.sub(r'\D', '', discounted_price_text) print(f"折扣价: {discounted_price}")
通用适配技巧
- 若遇到不同网站结构,优先查看页面源码里的价格属性:很多电商会用
data-original-price、data-sale-price这类自定义属性存储价格,直接提取属性值比匹配标签更可靠 - 结合文本辅助判断:比如波斯语页面中,原价旁可能标注"قیمت اصلی",折扣价旁标注"قیمت تخفیف خورده",可以用文本匹配或
find_previous_sibling()辅助定位目标元素
内容的提问来源于stack exchange,提问作者Alireza Mirhabibi - IRAN
相关产品推荐
相关产品推荐

