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
相关产品推荐
相关产品推荐

