我正在使用java,我想阅读维基百科中具有特定表面形式的管道链接。这种形式的[Fir]示例[America | US]表面形式为“US”,内部链接为“America”。
直接的解决方案是读取维基百科的xml转储并找到与管道链接的正则表达式匹配的字符串。但是,我担心我不会涵盖管道链接的所有可能的正则表达式。我搜查了一下,找不到任何专门给我管道链接的图书馆。
有什么建议吗?
答案 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。