阅读维基百科的管道链接

时间:2014-11-27 20:47:32

标签: java wikipedia

我正在使用java,我想阅读维基百科中具有特定表面形式的管道链接。这种形式的[Fir]示例[America | US]表面形式为“US”,内部链接为“America”。

直接的解决方案是读取维基百科的xml转储并找到与管道链接的正则表达式匹配的字符串。但是,我担心我不会涵盖管道链接的所有可能的正则表达式。我搜查了一下,找不到任何专门给我管道链接的图书馆。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

修改

现在我明白了这个问题:我认为没有办法让所有内部链接都具有打印输出值。这根本没有存储在database(仅links是)中,因为实际输出仅在呈现页面时创建。

您必须自己parse the pages以确保获得所有链接。当然,如果您只接受获取每个页面的wiki文本中可用的链接子集,则按照您的建议解析xml转储将起作用。请注意,单个正则表达式很可能无法区分管道内部链接和piped interwiki links。还要注意图像链接,它使用管道进行可变分离(例如[[Image:MyImage.jpeg|thumb|left|A caption!]])。

以下是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

我在这里假设英语维基百科,但它可以在任何地方使用,只需在您的语言代码的网址中替换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

allpages生成器返回的结果数量可以通过设置gaplimit参数来提高,例如得到all external links for the first 50 pages &gaplimit=50。如果您在正在查看的维基百科版本中请求bot status,则每个请求可以获得高达5000的结果,否则大多数(可能是所有)维基百科的最大值为500。