【发布时间】:2019-08-05 10:38:05
【问题描述】:
我正在使用BaseX 9.2 来抓取在线电话目录。没有什么违法的,它属于我老板所在的非营利组织,所以我可以访问它。我想要的是将所有这些号码添加到我的个人电话簿中,这样我就可以知道谁在给我打电话(主要是为了联系我的老板)。数据非常糟糕,尤其是数字(大约一千个数字,来自世界各地)。有些在 E164 中,有些不在,有些是完全无效的数字。
我最初使用OpenRefine 3.0 来清理数据。它还与Google's libphonenumber 配合得很好,可以很好地调整数字。就像从 Maven 下载 JAR 一样简单,将它放在 OpenRefine 的 lib 目录中,然后像这样在每个电话号码 (numberStr) 上调用 Jython:
from com.google.i18n.phonenumbers import PhoneNumberUtil
from com.google.i18n.phonenumbers.PhoneNumberUtil import PhoneNumberFormat
pu = PhoneNumberUtil.getInstance()
numberStr = str(int(value))
number = pu.parse('+' + numberStr, 'ZZ')
try: country = pu.getRegionCodeForNumber(number)
except: country = 'US'
number = pu.parse(numberStr, (country if pu.isValidNumberForRegion(number, country) else 'US'))
return pu.format(number, PhoneNumberFormat.E164)
我最近发现了 XPath 和 BaseX,发现它与 HTML 一起非常简洁和强大。虽然我可以让 OpenRefine 直接吐出 VCF,但我找不到使用 BaseX 插入 libphonenumber 的方法。由于两者都使用 Java,我认为它会很简单。
我尝试了他们的文档 (http://docs.basex.org/wiki/Java_Bindings),但 BaseX 没有发现 libphonenumber JAR 开箱即用。我尝试了各种路径、重命名和位置组合。我看到的唯一方法是编写一个包装器并将其放入 XQuery 模块 (XAR) 并导入它。这将需要大量时间和 Java 编码技能,而我绝对没有后者。
有没有一种简单的方法可以将 libphonenumber 与 BaseX 连接起来?或者一般来说,有没有办法将外部 Java 库与 XPath 链接?我可以回到 OpenRefine,但恕我直言,它的工作流程非常笨拙。也没有办法要求网站管理员清理他的行为。或者,如果 OpenRefine 和 BaseX 不是适合这项工作的工具,还有什么其他方法可以清理数据,尤其是电话号码?我需要每隔几个月执行一次(用于网站上的更改和更新),如果我不能完全自动化它,它会变得非常乏味。 至少需要一个基本的工作代码示例来回答..(我直接在 Windows 10 x64 机器上使用独立的 BaseX JAR)
【问题讨论】:
标签: xpath basex libphonenumber