This page is a translated version of the page Help:Export and the translation is 93% complete.
Outdated translations are marked like this.
PD 注意:當您編輯本頁面時,即同意以CC0協議授權您的貢獻。您可以在公有領域帮助页面找到更多信息。
此頁面的部分舊修訂版本是在知识共享署名-相同方式共享(CC BY-SA)許可下导入的。 只有新的貢獻採用公有領域授權。
PD

Wiki页面可以以一种特殊的$1格式导出,以上传导入到另一个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'

例如,要导出命名空间的所有页面。

获取要导出的页面的名称

我觉得一个例子更好,因为下面的描述感觉很不清楚。

  1. # 转到Special:Allpages并选择所需的文章/文件。
  2. 将页面名称列表复制到文本编辑器
  3. 将所有页面名称放在单独的行上
    1. 如果你使用所需的名称复制渲染页面的部分,你可以相对快速地实现这一点,并将其粘贴到文本编辑器,比如Word中——使用粘贴为无格式文本,然后打开替换函数(Ctrl+H),在查找一栏输入^t,替换一栏输入^p,然后点击全部替换按钮。 (这取决于页面名称之间的选项卡,这些通常是由于页面名称位于HTML源代码中的td标签内部而导致的。)
    2. 文本编辑器Vim还允许快速修复换行符:在粘贴整个列表后,运行命令:1,$s/\t/\r/g以通过回车替换所有选项卡然后:1,$s/^\n//g到删除仅包含换行符的每一行。
    3. 另一种方法是将格式化文本复制到任何可以将HTML源代码暴露出的编辑器中。 删除所有‎<tr>‎</tr>标签并将所有‎<td>标签替换为<tr><td>,并将‎<td>标签替换为</td></tr>,然后将HTML解析为所需格式。
    4. 如果您具有对服务器的shell和MySQL的访问权限,则可以使用此脚本:

mysql -umike -pmikespassword -hlocalhost wikidbname select page_title from wiki_page where page_namespace=0 EOF

注意,将mike和mikespassword替换为您自己的。此外,此示例显示带有前缀wiki_的表

  1. 将命名空间添加到页面名称(例如'Help:Contents'),除非所选命名空间是主命名空间。
  2. 对其他命名空间重复上述步骤(例如分类和模板)

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。 如果您想处理大量页面(例如整个转储),您可能无法在主内存中获取文档,因此您将需要一个基于$1或其他事件驱动方法的解析器。

您也可以使用正则表达式直接处理XML代码的各个部分。 这可能比其他方法更快,但不建议这样做,因为它很难维护。

请在此处列出处理XML导出的方法和工具:


详细细节和实用建议

  • 若要确定页面的命名空间,必须将其标题与/mediawiki/siteinfo/namespaces/namespace中定义的前缀相匹配
  • 可能的限制
    • sysop - 保护页面

为什么要导出

为什么不只是使用动态数据库下载呢?

假设您正在构建一个软件,在某些点上显示来自维基百科的信息。 如果你想让你的程序以不同于实时版本的方式显示信息,你可能需要使用输入的wiki代码,而不是转换完成的HTML。

此外,如果您想获取所有数据,您可能希望以最有效的方式传输数据。 维基媒体服务器需要做相当多的工作才能将维基代码转换为HTML。 这对您和维基媒体服务器来说都是非常耗时的,因此简单地抓取所有页面并不是正确的方式。

要访问XML中的任何文章,一次一个,转到Special:Export/Title_of_the_article

参见