java - 阅读维基百科管道链接

标签 java wikipedia

我正在使用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/

相关文章:

css - 如何打印保留样式的维基百科页面?

java - Arraylist 通过 java 中的 tcp?

java - 使用 Java 的 Optional 进行 Spring 注入(inject)

java - 如何从内部类的 try block 中获取字符串

grails - 基于Wiki的网站-技术选择

xml - 将维基百科转储索引到 elasticsearch 获取 XML 文档结构必须在同一实体错误中开始和结束

elasticsearch - 将Wikipedia的索引导入Elasticsearch

java - 重用语句和结果集是否会释放其先前使用的资源?还是我必须在重用之前明确关闭它们?

java - 如何使用现有表单中的 iText 将复选框样式设置为 "Check"?

java - 使用jsoup从两个标签之间提取不明的html内容?正则表达式?