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

BeautifulSoup爬取商品价格时如何去除多余换行得到规整格式

问题根源

Woolworths的价格DOM为了做字号、样式差异化渲染,会把$、整数部分、小数点、小数部分拆成多个独立的内联子节点。直接调用.text属性提取时,解析器会保留节点源码里的换行、缩进空白,最终把连续的价格拆成多行碎段。

可直接落地的修复方案

方案1:提取后做正则清洗(改造成本最低)

不需要调整原有元素定位逻辑,拿到原始价格文本后直接用正则移除所有空白字符即可,不管原始文本里有多少换行、空格、制表位,最终都能得到连续的标准价格格式:

import re
# raw_price是你原有逻辑直接取到的带换行的原始价格字符串
clean_price = re.sub(r"\s", "", raw_price)

商品名称字段可以用同逻辑做规整,只保留单词间的单个空格,移除首尾和多余换行:

clean_product_name = re.sub(r"\s+", " ", raw_product_name).strip()

方案2:DOM提取阶段直接规避空白问题(稳定性更高)

如果不想依赖后续文本清洗,可以在提取节点内容时直接拼接所有子文本节点,从源头跳过多余换行:

  • 用BeautifulSoup解析时的写法:
price_node = soup.select_one("替换为你的价格节点CSS选择器")
# 直接拼接节点下所有文本内容,不保留源码缩进换行
clean_price = "".join(price_node.find_all(string=True, recursive=True)).strip()
  • 用Selenium直接取元素时的写法:
price_node = driver.find_element("css selector", "替换为你的价格节点CSS选择器")
# 注入JS直接移除节点内所有空白字符,不受前端渲染格式影响
clean_price = driver.execute_script("return arguments[0].innerText.replace(/\s/g, '')", price_node)
爬取写入CSV的完整参考逻辑
import csv
import re
from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Chrome()
# 替换为实际要爬取的商品详情页地址
driver.get("目标Woolworths商品详情页链接")
soup = BeautifulSoup(driver.page_source, "html.parser")

# 提取并清洗商品名
raw_name = soup.select_one("h1.product-title").text
product_name = re.sub(r"\s+", " ", raw_name).strip()

# 提取并清洗价格
raw_price = soup.select_one(".price-dollars, .price-cents").parent.text
price = re.sub(r"\s", "", raw_price)
# 格式校验,避免混入原价、会员价等多余内容
price_match = re.search(r"\$\d+\.\d{2}", price)
if price_match:
    price = price_match.group()

# 写入CSV文件
with open("woolworths_goods.csv", "a", encoding="utf-8", newline="") as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow([product_name, price])

driver.quit()

注意:如果页面同时展示划线原价、会员专属价,需要把CSS选择器收窄到当前实际售价的DOM节点,避免清洗后把多段价格拼接成错误字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:57:51