通过 API 从 mediawiki 页面获取文本内容

Posted

技术标签:

【中文标题】通过 API 从 mediawiki 页面获取文本内容【英文标题】:Get Text Content from mediawiki page via API 【发布时间】:2010-12-10 03:45:34 【问题描述】:

我对 MediaWiki 还很陌生,现在我遇到了一些问题。 我有一些 Wiki 页面的标题,我只想使用 api.php 获取所述页面的文本,但我在 API 中找到的只是获取 Wiki 内容的一种方式页面(带有 wiki 标记)。我使用了这个 HTTP 请求...

/api.php?action=query&prop=revisions&rvlimit=1&rvprop=content&format=xml&titles=test

但我只需要文本内容,没有 Wiki 标记。 MediaWiki API 可以做到吗?

【问题讨论】:

我没有足够的微货币来为这个古老的问题添加答案,但对于任何搜索的人来说,值得注意的是 Mediawiki TextExtracts API (mediawiki.org/wiki/…)你只是一篇文章的文本内容。 (它保留了文章标题,但这相对容易用正则表达式输出。) 微币不够编辑:其实也可以去掉标题标记。示例查询:en.wikipedia.org/w/… 【参考方案1】:

在许多情况下,没有任何格式符号的 Wiki 页面实际上并没有多大意义。

如果你愿意,你可以自己去掉格式,但你会在这个过程中破坏一些东西。

(除非您正在创建类似搜索引擎的东西,在这种情况下,您只需要文本部分并且可以完全忽略格式符号)

【讨论】:

【参考方案2】:

我认为使用 API 来获取文本是不可能的。

对我有用的是请求 html 页面(使用您将在浏览器中使用的普通 URL)并去除内容 div 下的 HTML 标记。

编辑:

我使用HTML Parser for Java 取得了不错的成绩。它提供了如何去除给定 DIV 下的 HTML 标记的示例。

【讨论】:

我已经完成了,同样的事情,我有 java 应用程序,它必须接收 wiki 页面的文本内容。当我使用 api 并收到 wikisyntax 页面时,它的工作速度非常快,但我需要明文,我试图请求 HTML 页面并去除 HTML 标签,但它工作缓慢,因此我在 wiki API 中询问了此功能.或者你现在有一些好的 wikisyntax-clear text converter for Java,然后我可以直接在 Java 中转换它? ***语言的真正问题在于它是图灵完备的。如果你仔细观察一个页面的代码,你会注意到各种各样的自定义函数。还必须获取这些函数的定义,然后对其进行解释,这可能会扩展到更多函数。这就是我恢复到 html 解析的原因,它包含完整的渲染文本。 MediaWiki 的 wikitext 并不完全是图灵完备的,因为开发人员勇敢地拒绝了编辑对循环结构的要求。但是您是正确的,要从 MediaWiki 中获取纯文本,您需要获取 HTML,然后将其剥离。您可能希望使用我在 Perl 中为该工作制作的这个 html2txt.pl 工具,或者将其转换为您喜欢的语言:gist.github.com/751910 一个相对较新的 API 扩展 (TextExtracts) 现在允许从文章中提取纯文本。看我的回答。【参考方案3】:

使用action=parse获取html:

/api.php?action=parse&page=test

从 html 中获取文本的一种方法是将其加载到浏览器中并遍历节点,使用 javascript 仅查找文本节点。

【讨论】:

action=parse也可以通过添加format=json返回JSON。 在标题搜索结果中获取页面链接会很好。不确定是哪个查询字符串。另外,嗨@gilly3 .. :D 这个答案在十年后仍然有帮助。 使用 REST API 也是一种选择,用于获取 MediaWiki 页面 /rest.php/v1/page/<page name>/html 工作示例的已解析 html 版本:mediawiki.org/w/rest.php/v1/page/MediaWiki/html【参考方案4】:

这是最简单的方法: http://en.wikipedia.org/w/api.php?format=xml&action=query&titles=Albert%20Einstein&prop=revisions&rvprop=content

【讨论】:

不幸的是,这会返回 MediaWiki 标记,需要对其进行解析才能检索文本。【参考方案5】:

API 的 TextExtracts 扩展可以满足您的要求。使用prop=extracts 获得清理响应。例如,this link will give you cleaned up text for the Stack Overflow article。另一个好处是它仍然包含部分标签,因此您可以识别文章的各个部分。

只是为了在我的答案中包含一个可见的链接,上面的链接看起来像:

/api.php?format=xml&action=query&prop=extracts&titles=Stack%20Overflow&redirects=true

编辑:正如 Amr 所提到的,TextExtracts 是 MediaWiki 的扩展,因此它不一定适用于每个 MediaWiki 站点。

【讨论】:

TextExtracts 是 MediaWiki 的扩展。它适用于 Wikipedia,但并非适用于所有 MediaWiki 安装。 mediawiki.org/wiki/Extension:TextExtracts【参考方案6】:

在 MediaWiki 页面末尾添加 ?action=raw 会以原始文本格式返回最新内容。例如:-https://en.wikipedia.org/wiki/Main_Page?action=raw

【讨论】:

我在一个不在***上的页面上试过这个,但它没有用。这需要延期吗? 它似乎只适用于英文***——见example @MartinThoma 如果将%26action%3Draw 更改为?action=raw,它会起作用。 有没有什么方法可以在同一个请求中使用这个方法获取页面标题?【参考方案7】:

您可以使用explaintext 参数从API 获取文本格式的wiki 数据。另外,如果您需要访问多个标题的信息,您可以在一次调用中获取所有标题的 wiki 数据。使用竖线字符| 分隔每个标题。例如,此 API 调用将返回来自“Google”和“Yahoo”页面的数据:

http://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exlimit=max&explaintext&exintro&titles=Yahoo|Google&redirects=

参数:

explaintext:以纯文本形式返回提取,而不是有限的 HTML。 exlimit=max:返回多个结果。目前最大值为 20。 exintro:只返回第一节之前的内容。如果您想要完整的数据,只需将其删除即可。 redirects=:解决重定向问题。

【讨论】:

这简直太完美了。谢谢 这只会给你第一部分,而不是整篇文章的正文 我们还可以使用 exsectionformat=plain 来删除 wikitext 样式的格式(== 像这样 ==)。来源:mediawiki.org/w/… 可以通过这个页面的id获取一个页面的数据吗?【参考方案8】:

在内容被引入页面后,您可以做一件事 - 您可以使用 PHP 函数 strip_tags() 删除 HTML 标记。

【讨论】:

【参考方案9】:

遇到此问题的 Python 用户可能对 wikipedia 模块 (docs) 感兴趣:

import wikpedia
wikipedia.set_lang('de')
page = wikipedia.page('Wikipedia')
print(page.content)

除部分 (==) 之外的所有格式都被删除。

【讨论】:

【参考方案10】:

使用 action=render 获得尽可能干净的页面:

https://wiki.eclipse.org/Tip_of_the_Day/Eclipse_Tips/Now_where_was_I?action=render

https://wiki.eclipse.org/Tip_of_the_Day/Eclipse_Tips/Now_where_was_I

【讨论】:

以上是关于通过 API 从 mediawiki 页面获取文本内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 的 MediaWiki API 没有响应

仅从 MediaWiki 中的子页面 url 获取页面名称

MediaWiki API 和编码

使用 InputBox 向 MediaWiki 搜索查询添加额外的搜索文本

如何设置 og:image 以便从页面获取图像?

Mediawiki 重写到外部站点