Python亚马逊网页爬取:如何获取格式规范的商品价格
亚马逊加拿大站点商品价格爬取格式问题解决方案
问题描述
爬取亚马逊加拿大站点商品价格时,通过corePriceDisplay_desktop_feature_div节点提取的文本包含大量空白和换行,输出格式混乱:
$394.00 $ 394 . 00
使用的核心代码如下:
import requests from bs4 import BeautifulSoup url = 'https://www.amazon.ca/Nintendo-SwitchTM-Neon-Blue-Joy-E2-80-91ConTM-dp-B0BFJWCYTL/dp/B0BFJWCYTL/ref=dp_ob_title_vg' headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"} page = requests.get(url, headers=headers) soup1 = BeautifulSoup(page.content, "lxml") soup2 = BeautifulSoup(soup1.prettify(), "lxml") price = soup2.find(id='corePriceDisplay_desktop_feature_div').get_text() print(price)
解决方案
方法1:清理提取到的原始文本
直接对提取的文本进行空白字符清理,再用正则匹配标准价格格式:
import re # 提取文本并移除多余空白 price_text = soup2.find(id='corePriceDisplay_desktop_feature_div').get_text(strip=True) # 匹配$开头、整数+两位小数的价格格式 price_match = re.search(r'\$\d+\.\d{2}', price_text) if price_match: clean_price = price_match.group() print(clean_price) # 输出 $394.00
get_text(strip=True)会移除所有首尾空白,并将中间的多个空白/换行合并为单个空格,配合正则可精准提取有效价格。
方法2:定位更精确的子节点
亚马逊价格通常拆分为货币符号、整数部分、小数部分三个独立span,直接抓取各部分再拼接:
# 分别定位价格的组成节点 currency_symbol = soup2.find('span', class_='a-price-symbol') price_whole = soup2.find('span', class_='a-price-whole') price_fraction = soup2.find('span', class_='a-price-fraction') # 拼接成整洁价格 if currency_symbol and price_whole and price_fraction: clean_price = f"{currency_symbol.get_text(strip=True)}{price_whole.get_text(strip=True)}.{price_fraction.get_text(strip=True)}" print(clean_price) # 输出 $394.00
- 这种方法更稳定,避免页面小变动导致正则失效,直接抓取价格的核心组成部分。
额外优化
代码中无需两次解析BeautifulSoup,soup1.prettify()属于冗余操作,简化后代码更高效:
# 简化解析流程 soup = BeautifulSoup(page.content, "lxml") # 后续直接用soup进行节点查找即可
内容的提问来源于stack exchange,提问作者CSwizard
相关产品推荐
相关产品推荐

