我正在使用java,我想阅读来自维基百科的具有特定表面形式的管道链接。第一个这种形式的例子[美国|美国]表面形式是“美国”,内部链接是“美国”。
最简单的解决方案是读取 Wikipedia 的 xml 转储并查找与管道链接的正则表达式匹配的字符串。然而,我担心我不会涵盖管道链接的所有可能的正则表达式。我进行了搜索,但找不到任何专门为我提供管道链接的库。
有什么建议吗?
最佳答案
编辑
现在我明白了这个问题:我认为没有办法获得所有内部链接及其打印输出值。这根本不存储在 database 中(仅 links ),因为实际输出仅在渲染页面时创建。
你必须parse the pages您自己一定要获取所有链接。当然,如果您可以接受仅获取每个页面的 wiki 文本中可用的链接子集,那么按照您的建议解析 xml 转储就可以了。请注意,单个正则表达式很可能无法区分管道内部链接和 piped interwiki links 。还要注意使用管道进行变量分隔的图像链接(例如 [[Image:MyImage.jpeg|thumb|left|A title!]]
)。
这是 MediaWiki parser 使用的正则表达式:
$tc = Title::legalChars() . '#%';
# Match a link having the form [[namespace:link|alternate]]trail
$e1 = "/^([{$tc}]+)(?:\\|(.+?))?]](.*)\$/sD";
# Match cases where there is no "]]", which might still be images
$e1_img = "/^([{$tc}]+)\\|(.*)\$/sD";
但是,此代码是在进行大量预处理后应用的。
旧答案
使用 xml 转储不会为您提供所有链接,因为许多链接是由 templates 生成的,或者在某些情况下甚至 parser functions 。更简单的方法是使用 API :
https://en.wikipedia.org/w/api.php?action=query&titles=Stack_Overflow&prop=links&redirects
我假设这里是英语维基百科,但它可以在任何地方使用,只需将 URL 中的 en.
替换为您的语言代码即可。很明显,redirects
指令将确保遵循重定向。同理,使用prop=extlinks
获取外部链接:
https://en.wikipedia.org/w/api.php?action=query&titles=Stack_Overflow&prop=extlinks&redirects
您可以一次获取多个页面的链接,方法是用竖线字符分隔页面名称,如下所示:Stack_Overflow|Chicago
,或者使用生成器,例如allpages
(对 wiki 中的每个页面运行查询),如下所示:
https://en.wikipedia.org/w/api.php?action=query&generator=allpages&prop=links
可以通过设置gaplimit
参数来提高allpages
生成器返回的结果数量,例如&gaplimit=50
获取 all external links for the first 50 pages 。如果您要求bot status在您正在查看的维基百科版本中,每个请求最多可以获得 5000 个结果,否则大多数(可能是所有)维基百科的最大值为 500。
关于java - 阅读维基百科管道链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27178468/