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

72

我对MediaWiki还比较陌生,现在遇到一点问题。我有一个Wiki页面的标题,想用api.php获取该页面的文本内容,但是我在API中找到的仅仅是获取带有维基标记的Wiki内容的方法。我尝试了这个HTTP请求...

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

我需要的只是文字内容,而不带维基标记。使用MediaWiki API可以实现吗?


我没有足够的微货币来回答这个老问题,但对于任何搜索的人来说,值得注意的是,Mediawiki TextExtracts API(https://www.mediawiki.org/wiki/API:Get_the_contents_of_a_page#Method_3:_Use_the_TextExtracts_API)可以提供文章的纯文本内容。(它保留文章标题,但这相对容易通过正则表达式处理。) - sgfit
没有足够的微货币来编辑:实际上,您也可以删除标题标记。示例查询:https://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Pet_door&formatversion=2&explaintext=true&exsectionformat=plain - sgfit
9个回答

75

使用 action=parse 获取html:

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

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


10
通过添加 format=jsonaction=parse 也可以返回 JSON 格式。 - scai
获取标题搜索结果页面的链接会很不错。不确定是哪个查询字符串。另外,嗨@gilly3.. :D 这个答案在十年后仍然有用。 - Mahesh
使用REST API也是一种选择,可以获取MediaWiki页面的解析HTML版本/rest.php/v1/page/<page name>/html工作示例:https://www.mediawiki.org/w/rest.php/v1/page/MediaWiki/html - Robis Koopmans

47
API的TextExtracts扩展可以完成您要求的操作。使用prop=extracts来获取已清理的响应。例如,此链接将为您提供有关 Stack Overflow 文章的已清理文本。它还包括节(section)标签,因此您可以识别文章的各个部分。
只是为了在我的答案中包含一个可见的链接,上面的链接看起来像:
/api.php?format=xml&action=query&prop=extracts&titles=Stack%20Overflow&redirects=true

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


7
TextExtracts是MediaWiki的扩展程序,可用于维基百科,但并非适用于每个MediaWiki安装。 https://www.mediawiki.org/wiki/Extension:TextExtracts - Amr

40

1
我在维基百科以外的页面上尝试了这个,但它没有起作用。这需要一个扩展程序吗? - Tim Bird
它似乎只适用于英文维基百科 - 请参见示例 - Martin Thoma
1
@MartinThoma 如果你将 %26action%3Draw 改为 ?action=raw,它就可以工作了。 - KST
使用这种方法,是否有办法在同一请求中获取页面标题? - user4698348

33
您可以使用 explaintext 参数从API以文本格式获取维基数据。此外,如果您需要访问多个标题的信息,则可以在一个调用中获取所有标题的维基数据。使用管道符号 | 分隔每个标题。例如,此 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=: 解决重定向问题。

3
太完美了,谢谢。 - lnaia
这将为您提供仅第一节内容,而不是整篇文章的全部文本。 - Jonathan Morales Vélez
我们还可以使用exsectionformat=plain来删除维基文本样式格式(==像这样==)。来源:https://www.mediawiki.org/w/api.php?action=help&modules=query%2Bextracts - Eneas Gesing
你能否通过页面的ID获取该页面的数据? - Oleg Yablokov

11

4
很不幸,这会返回MediaWiki标记语言,必须解析它才能检索出文本。 - lightyrs

7

对于来到这个问题的Python用户可能会对wikipedia模块 (文档)感兴趣:

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

除了章节(==)之外,所有格式都被删除。

6

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

对我有效的方法是请求HTML页面(使用在浏览器中使用的普通URL),并在内容div下剥离HTML标签。

编辑:

我使用Java的HTML解析器取得了良好的结果。它有如何从给定DIV下剥离HTML标签的示例。


我已经完成了同样的事情。我有一个Java应用程序,必须接收维基页面的文本内容。当我使用API并接收维基语法页面时,它非常快,但我需要清晰的文本。我尝试请求HTML页面并剥离HTML标签,但速度很慢,因此我在维基API中询问了这个功能。或者你知道一些好的适用于Java的维基语法清晰文本转换器,那么我可以直接在Java中进行转换吗? - Le_Coeur
2
维基百科语言的真正问题在于它是图灵完备的。如果你仔细查看页面的代码,你会注意到各种自定义函数。这些函数的定义也必须被获取并解释,这可能会扩展到更多的函数。这就是为什么我回归到HTML解析,其中包含完整的渲染文本。 - Eric Normand
2
MediaWiki的维基文本并不完全具备图灵完备性,因为开发人员勇敢地抵制了编辑器对循环结构的要求。但是你说得对,要从MediaWiki中获得纯文本,你需要获取HTML,然后将其剥离。你可能会喜欢使用我在Perl中制作的html2txt.pl工具来完成这项工作,或者将其转换为您喜欢的语言: https://gist.github.com/751910 - hippietrail
API的一个相对较新的扩展(TextExtracts)现在允许从文章中提取纯文本。请查看我的答案。 - eric.mitchell


-2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接