跳转到主要内容

从原始字符串中提取价格和货币

项目描述

PyPI Version Supported Python Versions Build Status Coverage report

price-parser 是一个小型库,用于从原始文本字符串中提取价格和货币。

特性

  • 强大的价格金额和货币符号提取

  • 零成本处理千位分隔符和小数分隔符

主要用例是从网页中提取价格。例如,您可以编写一个CSS/XPath选择器,针对具有价格的元素,然后使用此库进行清理,而不是编写特定于站点的正则表达式或Python代码。

许可证是BSD 3条款。

安装

pip install price-parser

price-parser 需要 Python 3.6+。

使用

基本用法

>>> from price_parser import Price
>>> price = Price.fromstring("22,90 €")
>>> price
Price(amount=Decimal('22.90'), currency='€')
>>> price.amount       # numeric price amount
Decimal('22.90')
>>> price.currency     # currency symbol, as appears in the string
'€'
>>> price.amount_text  # price amount, as appears in the string
'22,90'
>>> price.amount_float # price amount as float, not Decimal
22.9

如果您愿意,Price.fromstring有一个别名price_parser.parse_price,它们做的是同一件事

>>> from price_parser import parse_price
>>> parse_price("22,90 €")
Price(amount=Decimal('22.90'), currency='€')

该库具有广泛的测试(900+真实世界的价格字符串示例)。以下是一些支持的案例描述。

支持的案例

支持各种货币的杂乱的价格字符串;处理千位分隔符和小数分隔符

>>> Price.fromstring("Price: $119.00")
Price(amount=Decimal('119.00'), currency='$')
>>> Price.fromstring("15 130 Р")
Price(amount=Decimal('15130'), currency='Р')
>>> Price.fromstring("151,200 تومان")
Price(amount=Decimal('151200'), currency='تومان')
>>> Price.fromstring("Rp 1.550.000")
Price(amount=Decimal('1550000'), currency='Rp')
>>> Price.fromstring("Běžná cena 75 990,00 Kč")
Price(amount=Decimal('75990.00'), currency='Kč')

欧元符号在任意情况下用作小数分隔符

>>> Price.fromstring("1,235€ 99")
Price(amount=Decimal('1235.99'), currency='€')
>>> Price.fromstring("99 € 95 €")
Price(amount=Decimal('99'), currency='€')
>>> Price.fromstring("35€ 999")
Price(amount=Decimal('35'), currency='€')

处理一些特殊案例

>>> Price.fromstring("Free")
Price(amount=Decimal('0'), currency=None)

当无法提取价格或货币时,相应的属性值设置为 None

>>> Price.fromstring("")
Price(amount=None, currency=None)
>>> Price.fromstring("Foo")
Price(amount=None, currency=None)
>>> Price.fromstring("50% OFF")
Price(amount=None, currency=None)
>>> Price.fromstring("50")
Price(amount=Decimal('50'), currency=None)
>>> Price.fromstring("R$")
Price(amount=None, currency='R$')

货币提示

currency_hint 参数允许传入可能(或可能不)包含货币信息的文本字符串。此功能对于自动提取价格非常有用。

>>> Price.fromstring("34.99", currency_hint="руб. (шт)")
Price(amount=Decimal('34.99'), currency='руб.')

请注意,主价格字符串中提到的货币可能比 currency_hint 参数中指定的货币更受青睐;这取决于那里找到的货币符号。如果您知道正确的货币,可以直接设置它。

>>> price = Price.fromstring("1 000")
>>> price.currency = 'EUR'
>>> price
Price(amount=Decimal('1000'), currency='EUR')

小数分隔符

如果您知道输入字符串中使用的符号作为小数分隔符,请通过 decimal_separator 参数传递该符号,以防止价格解析器猜测错误的小数分隔符符号。

>>> Price.fromstring("Price: $140.600", decimal_separator=".")
Price(amount=Decimal('140.600'), currency='$')
>>> Price.fromstring("Price: $140.600", decimal_separator=",")
Price(amount=Decimal('140600'), currency='$')

贡献

使用 tox 在不同的 Python 版本上运行测试

tox

上面的命令还会运行类型检查;我们使用 mypy。

变更

0.3.4 (2020-11-25)

0.3.3 (2020-02-05)

  • 修复了某些 Windows 机器上的安装问题。

0.3.2 (2020-01-28)

  • 改进了韩元和日元的货币检测。

  • 声明支持 Python 3.8。

0.3.1 (2019-10-21)

  • 冗余的美元符号不再作为货币的一部分返回,例如,对于 SGD$ 100,货币将是 SGD,而不是 SGD$

0.3.0 (2019-10-19)

  • 新的 Price.fromstring 参数 decimal_separator 允许在已知的情况下覆盖小数分隔符(即禁用小数分隔符检测);

  • 添加了非官方货币名称 NTD 和 RBM;

  • 正则表达式中的量词变为非贪婪的,这提供了一些速度提升;

  • 测试改进。

0.2.4 (2019-07-03)

  • 声明 price-parser 提供类型注解(pep-561)。这使使用 price-parser 的项目能够进行更好的类型检查。

  • 提高了测试覆盖率

0.2.3 (2019-06-18)

  • 针对 0.2.2 版本的后续改进:改进了解析小数点后具有 4+ 位数字的价格。

0.2.2 (2019-06-18)

  • 修复了解析小数点后具有 4+ 位数字的价格。

0.2.1 (2019-04-19)

  • 添加了 23 个额外的货币符号;

  • A$ 是澳大利亚元的别名。

0.2 (2019-04-12)

添加了对被欧元取代的货币的支持。

0.1.1 (2019-04-12)

进行了小的打包修复。

0.1 (2019-04-12)

初始发布。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。

源分布

price-parser-0.3.4.tar.gz (32.6 kB 查看哈希值)

上传时间

构建分布

price_parser-0.3.4-py2.py3-none-any.whl (15.2 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持