如何在Python或Jupyter Notebook中安装libpostal或国际地址解析器及解决导入address库的语法错误
解决Python3环境下
address库导入的SyntaxError问题,以及国际地址解析器推荐 错误原因分析
你遇到的SyntaxError完全不是你的代码问题——问题出在你安装的address库本身!这个库是基于Python2开发的,它的源代码里用了Python2的print语句(不带括号),但Python3里print是必须带括号的函数。当Python3解释器加载这个库的代码时,直接就触发了语法错误。而且从代码风格来看,这个库大概率已经停止维护了,完全不兼容Python3环境。
针对国际地址解析的替代方案
既然你需要支持全球地址而非仅美国地址的解析器,强烈推荐你使用libpostal(它的Python绑定是pypostal)。它专门针对全球地址解析做了优化,支持几乎所有国家的地址格式,而且完全兼容Python3,目前还在活跃维护中。
安装步骤(Jupyter Notebook中执行)
首先需要安装系统级依赖(以下是Ubuntu/Debian的命令,Windows/macOS可以参考对应系统的安装流程):
!sudo apt-get install curl autoconf automake libtool pkg-config !git clone https://github.com/openvenues/libpostal !cd libpostal && ./bootstrap.sh && ./configure --datadir=/usr/local/share/libpostal && make && sudo make install !sudo ldconfig
然后安装Python绑定pypostal:
!pip install postal
使用示例
在Jupyter中导入并解析国际地址:
from postal.parser import parse_address # 解析德国地址 de_address = "Marienplatz 8, 80331 München, Deutschland" parsed_de = parse_address(de_address) print(parsed_de) # 解析中国地址 cn_address = "北京市朝阳区建国门外大街1号" parsed_cn = parse_address(cn_address) print(parsed_cn)
解析结果会以(组件值, 组件类型)的元组列表返回,比如德国地址的结果类似:
[('8', 'house_number'), ('marienplatz', 'road'), ('80331', 'postcode'), ('münchen', 'city'), ('deutschland', 'country')]
总结
- 别再尝试使用
address库了,它不仅不兼容Python3,还已经没人维护; libpostal是更适合国际地址解析的选择,功能覆盖广、适配性强。
内容的提问来源于stack exchange,提问作者Fox White
相关产品推荐
相关产品推荐

