Help:导出
![]() |
注意:當您編輯本頁面時,即同意以CC0協議授權您的貢獻。您可以在公有領域帮助页面找到更多信息。 此頁面的部分舊修訂版本是在知识共享署名-相同方式共享(CC BY-SA)許可下导入的。 只有新的貢獻採用公有領域授權。 |
![]() |
Wiki页面可以以一种特殊的XML格式导出,以上传导入到另一个MediaWiki安装中(如果此功能在目标wiki上被启用,且用户是该wiki的管理员)或被用于其他用途,例如对内容进行分析。 要了解导出页面其他信息,而不是页面本身,请参见Syndication feeds;要了解导入页面,请参见Help:Import 。
如何导出
有至少4种导出页面的方式:
- 在Special:Export的框中粘贴文章的名称或使用 //www.mediawiki.org/wiki/Special:Export/FULLPAGENAME。
- 备份脚本
dumpBackup.php
将所有wiki页面转储为XML文件。dumpBackup.php
仅适用于MediaWiki 1.5或更高版本。 您需要直接访问服务器才能运行此脚本。 维基媒体项目的转储定期以 https://dumps.wikimedia.org/ 的形式提供。 - 有OAI-PMH用于定期获取自特定时间以来已修改的页面的界面。 对于维基媒体项目,此界面不公开;参见Wikimedia update feed service 。 OAI-PMH包含围绕实际导出文章的包装格式。
- 使用Pywikibot框架。在此不供解释。
默认情况下,仅包含页面的当前版本。 您可以选择使用日期,时间,用户名和编辑摘要获取所有版本。 可选地,还可以导出直接或间接调用的所有模板的最新版本。 If you import a dump that doesn't include templates, then the resulting pages will probably render incorrectly if the templates they need do not exist on the destination wiki.
此外,您可以复制SQL数据库。 这是在MediaWiki 1.5之前使数据库的转储可用的方式,这里不再对其进行解释。
使用'Special:Export'
例如,要导出命名空间的所有页面。
获取要导出的页面的名称
我觉得一个例子更好,因为下面的描述感觉很不清楚。
- # 转到Special:Allpages并选择所需的文章/文件。
- 将页面名称列表复制到文本编辑器
- 将所有页面名称放在单独的行上
- 如果你使用所需的名称复制渲染页面的部分,你可以相对快速地实现这一点,并将其粘贴到文本编辑器,比如Word中——使用粘贴为无格式文本,然后打开替换函数(Ctrl+H),在查找一栏输入
^t
,替换一栏输入^p
,然后点击全部替换按钮。 (这取决于页面名称之间的选项卡,这些通常是由于页面名称位于HTML源代码中的td标签内部而导致的。) - 文本编辑器Vim还允许快速修复换行符:在粘贴整个列表后,运行命令:1,$s/\t/\r/g以通过回车替换所有选项卡然后:1,$s/^\n//g到删除仅包含换行符的每一行。
- 另一种方法是将格式化文本复制到任何可以将HTML源代码暴露出的编辑器中。 删除所有
<tr>
和</tr>
标签并将所有<td>
标签替换为<tr><td>
,并将<td>
标签替换为</td></tr>
,然后将HTML解析为所需格式。 - 如果您具有对服务器的shell和MySQL的访问权限,则可以使用此脚本:
- 如果你使用所需的名称复制渲染页面的部分,你可以相对快速地实现这一点,并将其粘贴到文本编辑器,比如Word中——使用粘贴为无格式文本,然后打开替换函数(Ctrl+H),在查找一栏输入
mysql -umike -pmikespassword -hlocalhost wikidbname
select page_title from wiki_page where page_namespace=0
EOF
注意,将mike和mikespassword替换为您自己的。此外,此示例显示带有前缀wiki_的表
- 将命名空间添加到页面名称(例如'Help:Contents'),除非所选命名空间是主命名空间。
- 对其他命名空间重复上述步骤(例如分类和模板)
PostgreSQL数据库的类似脚本如下所示:
psql -At -U wikiuser -h localhost wikidb -c "select page_title from mediawiki.page"
注意,替换你自己Wiki用户,数据库会提示你输入密码。 此示例显示没有前缀wiki_的表,并且将命名空间指定为表名的一部分。
执行导出
- 转到Special:Export并将所有页面名称粘贴到文本框中,确保没有空行。
- 点击“提交请求”
- 使用浏览器的保存工具将生成的XML保存到文件中。
并且最后……
- 在文本编辑器中打开XML文件。 滚动到底部以检查错误消息。
现在您可以将此XML文件用于执行导入。
完整导出历史
通过导出修订历史,保留作者信息与署名可被保留。 Special:Export界面中的复选框选择是导出完整历史记录(文章的所有版本)还是最新版本的文章。 最多返回100个修订版,其他修订可以按Parameters to Special:Export 的要求详细说明。
导出格式
您收到的XML文件的格式在所有方面都是相同的。
它被编入 https://www.mediawiki.org/xml/export-0.11.xsd 的$1 Schema中。
此格式不适合在web浏览器中查看。
某些浏览器会显示带有+
和-
链接的精美打印的XML,用于查看或隐藏所选部分。
或者,可以使用浏览器的“查看源代码”功能查看XML源代码,或者在将XML文件保存到本地后,使用所选程序查看XML源代码。
如果您直接阅读XML源代码,则不难找到实际的wiki文本。
如果不使用特殊的XML编辑器,则<code><</code>和<code>></code>将显示为<syntaxhighlight lang="html" inline><</syntaxhighlight>和<syntaxhighlight lang="html" inline>></syntaxhighlight>,以避免与XML标记冲突;为了避免歧义,<syntaxhighlight lang="html" inline>&</syntaxhighlight>编码为<syntaxhighlight lang="html" inline>&</syntaxhighlight>。
在当前版本中,导出格式不包含wiki标记的XML替换(请参阅旧提案的Wikipedia DTD)。 您只能在编辑文章时获得wiki文本。
<mediawiki xml:lang="en">
<page>
<title>Page title</title>
<restrictions>edit=sysop:move=sysop</restrictions>
<revision>
<timestamp>2001-01-15T13:15:00Z</timestamp>
<contributor><username>Foobar</username></contributor>
<comment>I have just one thing to say!</comment>
<text>A bunch of [[Special:MyLanguage/text|text]] here.</text>
<minor />
</revision>
<revision>
<timestamp>2001-01-15T13:10:27Z</timestamp>
<contributor><ip>10.0.0.2</ip></contributor>
<comment>new!</comment>
<text>An earlier [[Special:MyLanguage/revision|revision]].</text>
</revision>
</page>
<page>
<title>Talk:Page title</title>
<revision>
<timestamp>2001-01-15T14:03:00Z</timestamp>
<contributor><ip>10.0.0.2</ip></contributor>
<comment>hey</comment>
<text>WHYD YOU LOCK PAGE??!!! i was editing that jerk</text>
</revision>
</page>
</mediawiki>
DTD
这是一个非官方的简短的文档类型定义版本的格式。 如果您不知道DTD是什么,请忽略它。
<!ELEMENT mediawiki (siteinfo,page*)>
<!-- version包含格式的版本号(当前为0.3) -->
<!ATTLIST mediawiki
version CDATA #REQUIRED
xmlns CDATA #FIXED "https://www.mediawiki.org/xml/export-0.3/"
xmlns:xsi CDATA #FIXED "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation CDATA #FIXED
"https://www.mediawiki.org/xml/export-0.3/ https://www.mediawiki.org/xml/export-0.3.xsd"
xml:lang CDATA #IMPLIED
>
<!ELEMENT siteinfo (sitename,base,generator,case,namespaces)>
<!ELEMENT sitename (#PCDATA)> <!-- wiki的名称 -->
<!ELEMENT base (#PCDATA)> <!-- 主页的URL -->
<!ELEMENT generator (#PCDATA)> <!-- MediaWiki版本字符串 -->
<!ELEMENT case (#PCDATA)> <!-- 如何处理页面名称中的大小写 -->
<!-- 可选的值:'first-letter' | 'case-sensitive'
'Case-insensitive'选项将保留以备未来使用 -->
<!ELEMENT namespaces (namespace+)> <!-- 命名空间和前缀列表 -->
<!ELEMENT namespace (#PCDATA)> <!-- 包含命名空间前缀 -->
<!ATTLIST namespace key CDATA #REQUIRED> <!-- 内部命名空间编号 -->
<!ELEMENT page (title,id?,restrictions?,(revision|upload)*)>
<!ELEMENT title (#PCDATA)> <!-- 带命名空间前缀的标题 -->
<!ELEMENT id (#PCDATA)>
<!ELEMENT restrictions (#PCDATA)> <!-- 可选页面限制 -->
<!ELEMENT revision (id?,timestamp,contributor,minor?,comment?,text)>
<!ELEMENT timestamp (#PCDATA)> <!-- 根据ISO8601 -->
<!ELEMENT minor EMPTY> <!-- minor标志 -->
<!ELEMENT comment (#PCDATA)>
<!ELEMENT text (#PCDATA)> <!-- wiki语法 -->
<!ATTLIST text xml:space CDATA #FIXED "preserve">
<!ELEMENT contributor ((username,id) | ip)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT ip (#PCDATA)>
<!ELEMENT upload (timestamp,contributor,comment?,filename,src,size)>
<!ELEMENT filename (#PCDATA)>
<!ELEMENT src (#PCDATA)>
<!ELEMENT size (#PCDATA)>
处理XML导出
许多工具可以处理导出的XML。 如果您想处理大量页面(例如整个转储),您可能无法在主内存中获取文档,因此您将需要一个基于SAX或其他事件驱动方法的解析器。
您也可以使用正则表达式直接处理XML代码的各个部分。 这可能比其他方法更快,但不建议这样做,因为它很难维护。
请在此处列出处理XML导出的方法和工具:
- Parse MediaWiki Dump(crates.io)是一个用于解析XML转储的Rust crate。
- Parse Wiki Text(crates.io)是一个Rust crate,用于将wiki文本解析为元素树。
- Parse::MediaWikiDump是用于处理XML转储文件的perl模块。
- 使用STX处理MediaWiki XML - 基于流的XML转换
- IBM历史流程项目可以在应用一个Python的小程序(export-historyflow-expand.py)后读取它。
详细细节和实用建议
- 若要确定页面的命名空间,必须将其标题与
/mediawiki/siteinfo/namespaces/namespace
中定义的前缀相匹配 - 可能的限制
sysop
- 保护页面
为什么要导出
为什么不只是使用动态数据库下载呢?
假设您正在构建一个软件,在某些点上显示来自维基百科的信息。 如果你想让你的程序以不同于实时版本的方式显示信息,你可能需要使用输入的wiki代码,而不是转换完成的HTML。
此外,如果您想获取所有数据,您可能希望以最有效的方式传输数据。 维基媒体服务器需要做相当多的工作才能将维基代码转换为HTML。 这对您和维基媒体服务器来说都是非常耗时的,因此简单地抓取所有页面并不是正确的方式。
要访问XML中的任何文章,一次一个,转到Special:Export/Title_of_the_article