
本文介绍在网页爬虫场景下,如何使用正则表达式从含货币符号、逗号、小数点等格式的文本(如 "$1,299.99")中精准提取纯数字字符串,并转换为数值类型,适用于价格比对等实际业务需求。
本文介绍在网页爬虫场景下,如何使用正则表达式从含货币符号、逗号、小数点等格式的文本(如 "$1,299.99")中精准提取纯数字字符串,并转换为数值类型,适用于价格比对等实际业务需求。
在使用 Selenium 抓取网页价格时(例如
$1,299.99
),WebElement.getText() 返回的是原始显示文本,包含 $、,、空格等非数字字符。直接用于数值计算或比较会导致异常。因此,需对字符串进行清洗与解析。✅ 推荐处理流程
- 提取原始文本:调用 price.getText() 获取字符串;
- 清洗非数字字符:保留数字和小数点(.),移除 $、,、空格、¥、€ 等所有干扰符号;
- 转换为数值类型:根据精度需求选择 Double.parseDouble() 或 BigDecimal(推荐用于价格,避免浮点误差)。
? 示例代码(完整可运行)
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class PriceExtractor {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "...driver\chromedriver.exe");
try (ChromeDriver driver = new ChromeDriver()) {
driver.manage().window().maximize();
driver.get("https://example.com/product");
WebElement priceElement = driver.findElement(By.xpath("//p[contains(@class, 'box-price-present')]"));
String rawPrice = priceElement.getText().trim();
System.out.println("原始文本: " + rawPrice); // e.g., "$1,299.99"
String numericStr = parseNumericPrice(rawPrice);
System.out.println("纯数字字符串: " + numericStr); // e.g., "1299.99"
// ✅ 安全转换:建议使用 BigDecimal 处理价格(避免 double 精度丢失)
java.math.BigDecimal priceValue = new java.math.BigDecimal(numericStr);
System.out.println("BigDecimal 价格: " + priceValue); // 1299.99
// ⚠️ 若必须用 double,请确保输入格式可靠(小数点仅出现一次)
// double priceDouble = Double.parseDouble(numericStr);
}
}
/**
* 从价格文本中提取仅含数字和小数点的字符串
* 支持带千分位逗号、货币符号、空格、中文符号(如“¥”)的混合输入
*/
public static String parseNumericPrice(String input) {
if (input == null || input.trim().isEmpty()) {
return "0";
}
// 保留数字 0-9 和小数点 .,移除其余所有字符
// 注意:正则 [^0-9.] 中的点无需转义(在字符类内是字面量)
return input.replaceAll("[^0-9.]", "");
}
}
⚠️ 关键注意事项
- 小数点唯一性:若原始文本含多个小数点(如 "1.23.45"),正则会保留全部,导致 parseDouble 失败。建议增加校验逻辑(如只保留第一个小数点);
- 千分位处理:本方案自动移除逗号,无需额外处理;
- 国际化兼容:若遇到 1.234,56(欧洲格式,逗号为小数点),需先识别区域格式再预处理,不能依赖通用正则;
- 空值与异常防护:务必对 null、空字符串、纯非数字输入做兜底(如返回 "0"),并在 parseDouble/BigDecimal 调用处添加 try-catch;
- 性能提示:正则 replaceAll 在单次调用中开销极小,无需过度优化。
✅ 总结
从网页文本中提取纯数字价格,核心在于「精准清洗 + 类型安全转换」。replaceAll("[^0-9.]", "") 是简洁可靠的起点;而 BigDecimal 是金融级价格处理的黄金标准。结合 Selenium 的稳定抓取能力,即可构建鲁棒的价格采集与比对系统。











