【问题标题】:How to export text from all pages of a MediaWiki?如何从 MediaWiki 的所有页面导出文本?
【发布时间】:2021-03-07 22:22:28
【问题描述】:

我有一个 MediaWiki 正在运行,它代表一个德语术语词典及其对当地方言的翻译。每页包含一个术语、其翻译和一些附加信息。

现在,对于字典的可打印版本,我需要完整导出所有术语及其翻译。由于这是页面内容的摘录,我想我需要以可解析格式完整导出所有页面的最新版本,例如xml 或 csv。

有没有人这样做或可以向我指出一个工具? 我应该提一下,我没有对服务器的完全访问权限,例如没有命令行,但我可以添加 MediaWiki 扩展或访问 MySQL 数据库。

【问题讨论】:

  • 我很高兴有人问了这个问题。正如 Mike Gancarz 在他的书中所说,“强制用户界面”很糟糕。

标签: export mediawiki


【解决方案1】:

您可以直接从数据库中导出页面内容。它将是原始的 wiki 标记,就像使用 Special:Export 时一样。但是编写导出脚本会更容易,而且您不需要确保所有页面都属于某个特殊类别。

这是一个例子:

SELECT page_title, page_touched, old_text
FROM revision,page,text
WHERE revision.rev_id=page.page_latest
AND text.old_id=revision.rev_text_id;

如果您的 wiki 使用 Postgresql,则表“text”被命名为“pagecontent”,您可能需要指定架构。在这种情况下,相同的查询将是:

SET search_path TO mediawiki,public;

SELECT page_title, page_touched, old_text 
FROM revision,page,pagecontent
WHERE revision.rev_id=page.page_latest
AND pagecontent.old_id=revision.rev_text_id;

【讨论】:

  • 由于我自动建立了常用类别并且效果很好,所以我会继续使用这种方法,但无论如何,谢谢提示,它可能会派上用场。
  • @Geziefer 你是如何自动设置类别的?
  • @BT:每个页面都使用相同的模板,并且我对所有页面都有共同的类别(“术语”)。另外,我使用 mediawiki 函数通过解析页面名称的第一个字母并使其成为一个类别来添加另一个类别。
【解决方案2】:

这对我来说效果很好。请注意,我将输出重定向到文件 backup.xml。在 Windows 命令处理器 (CMD.exe) 提示符下:

cd \PATH_TO_YOUR_WIKI_INSTALLATION\maintenance
\PATH_OF_PHP.EXE\php dumpBackup.php --full > backup.xml

【讨论】:

  • 如上一个答案所述,我无权访问提示。
【解决方案3】:

我对解决方案并不完全满意,但我最终为所有页面指定了一个公共类别,然后我可以在 Special:Export 框中添加此类别和所有包含的页面名称。它似乎有效,尽管我不确定当我达到几千页时它是否仍然有效。

【讨论】:

  • 对使用类似方法的人的更新:我们现在在一次导出中拥有超过 1400 个术语,并且它运行迅速且没有问题,因此它似乎是一种有效的方法。
【解决方案4】:

导出

cd maintenance
php5 ./dumpBackup.php --current > /path/wiki_dump.xml

导入

cd maintenance
php5 ./importDump.php < /path/wiki_dump.xml

【讨论】:

  • 您可能在我的问题中错过了“我应该提到,我没有完全访问服务器的权限,例如没有命令行”这一点。 - 你不应该在答案中嘲笑stackoverflow,而是在meta上发布具体问题。
【解决方案5】:

它看起来并不简单。 http://meta.wikimedia.org/wiki/Help:Export 可能会有所帮助,但可能不会。

如果所有页面的结构都相同,您也许可以使用Scrapy 之类的内容编写网络爬虫

【讨论】:

  • 好吧,标准导出功能只导出离散页面,我需要的是所有页面的完整导出。还没有听说过 Scrapy,感谢您的提示,但我想由于我的所有页面都使用通用模板,因此从每篇文章的键值对列表中提取数据比摆弄 html 更容易。
  • dumpBackup.php 我认为可以将所有页面输出到xml,尽管它需要服务器访问权限才能执行它,而您没有,所以它可能没有用。如果您可以从外部访问数据库,那可能是您最好的选择
  • 您将如何处理数据库访问?如果我做对了,内容就会隐藏在 blob 结构中。但也许将在线站点的数据库完整转储并通过本地媒体维基导入本地数据库会有所帮助?无论如何,我想一定有某种方法可以进行导出,这似乎适用于一个页面,一次只适用于所有页面......
  • 页面文本似乎确实存储在 text 表中的 BLOB 中。我没有任何经验,所以我不确定在你的情况下使用它会涉及什么。有关信息,数据库架构位于 upload.wikimedia.org/wikipedia/commons/b/b7/…
【解决方案6】:

可以使用特殊页面Special:Export导出为XML; here is Wikipedia's version.

如果您希望它最终成为人类可读的(例如 PDF)表单,您也可以考虑 Extension:Collection

【讨论】:

  • 如下所述,我知道要导出的特殊页面,但是您必须添加 all 页面名称作为参数。我希望有可能只导出每个页面,而不必全部指定。人类可读的形式不是我想要的,我确实需要页面的内容,即模板中填写的值,而不是呈现的内容。
【解决方案7】:

您可以将https://www.mediawiki.org/wiki/Manual:$wgExportAllowAll 设置为true,然后从Special:Export 中导出所有页面。

【讨论】:

  • 感谢您的评论,但我想这会导出所有页面吗?在我的情况下,我只需要包含一个术语的页面,所以我可以继续使用我提到的解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 2015-02-13
  • 1970-01-01
相关资源
最近更新 更多