【问题标题】:Convert Wikipedia/MediaWiki's code into HTML using python使用 python 将 Wikipedia/MediaWiki 的代码转换为 HTML
【发布时间】:2015-02-28 14:17:05
【问题描述】:

我正在尝试从 Wikipedia 获取内容并使用文章的 HTML。理想情况下,我还希望能够更改内容(例如,隐藏某些信息框等)。

我可以使用mwclient获取页面内容:

>>> import mwclient
>>> site = mwclient.Site('en.wikipedia.org')
>>> page = site.Pages['Samuel_Pepys']
>>> print page.text()
{{Redirect|Pepys}}
{{EngvarB|date=January 2014}}
{{Infobox person
...

但我看不到使用 python 将这个 wikicode 转换为 HTML 的相对简单、轻量级的方法。

  • Pandoc 无法满足我的需求。

  • 我可以使用 Beautiful Soup 抓取原始页面,但这似乎不是一个特别优雅的解决方案。

  • mwparserfromhell 可能会在此过程中有所帮助,但我无法从文档中完全判断它是否为我提供了我需要但还没有的任何东西。

  • 我在Alternative Parsers 页面上看不到明显的解决方案。

我错过了什么?

更新: I wrote up what I ended up doing, following the discussion below.

【问题讨论】:

  • “翻译成 HTML”是什么意思?您下载的页面已经是 HTML。您可能需要更具体地说明您想要什么。
  • 我以为我说得很具体。我还没有下载任何“页面”。我查询了 Wikipedia API 并获取了 MediaWiki 标记中的内容,如示例所示。我想把它翻译成 HTML。
  • 啊。我懂了。好吧,如果您只是从 MediaWiki 获取内容并且它还不是您喜欢的 HTML 格式,那么您可以构建 HTML 以包含该内容。老实说 BeautifulSoup 是一个很棒的模块,我在许多应用程序中都使用过它。它已经向您传递了完整的 HTML,您可以随意修改(隐藏某些信息框等)。
  • 是的,你可能是对的。令我惊讶的是,我找不到将 MediaWiki 代码转换为 HTML 的简单方法。我认为这将是一个相当普遍的需求。抓取网页,即使是像 Beautiful Soup 这样的好东西,感觉就像是最后的手段,尤其是在有 API 的情况下。
  • 好吧,有一个用于抓取内容的 API,而不是用于生成 HTML 的 API,因为这与应用程序的需求高度相关。您可以构建自己的 HTML shell 并使用 API 来获取内容,只需将内容“包含”到 shell 中指定的
    标记中。

标签: python parsing mediawiki


【解决方案1】:
page="""<html>
your pretty html here
<div id="for_api_content">%s</div>
</html>"""

现在您可以使用 API 获取原始内容并调用

generated_page = page%api_content

通过这种方式,您可以设计任何您想要的 HTML,并将 API 内容插入到设计好的位置。

您使用的那些 API 旨在返回原始内容,因此您可以自行决定希望原始内容的显示方式。

更新

既然你向我展示了你正在处理的实际输出,我意识到你的困境。不过幸运的是,有些模块已经为您解析并转换为 HTML。

有一个名为mwlib 的工具会解析wiki 并输出为HTML、PDF 等。您可以使用install instructions 使用pip 安装它。这可能是您更好的选择之一,因为它是由 Wikimedia Foundation 和 PediaPress 合作创建的。

一旦你安装了它,你就可以使用writer 方法来做脏活。

def writer(env, output, status_callback, **kwargs): pass

这里是这个模块的文档:http://mwlib.readthedocs.org/en/latest/index.html

您可以在writer 对象上设置attributes 来设置文件类型(HTML、PDF 等)。

writer.description = 'PDF documents (using ReportLab)'
writer.content_type = 'application/pdf'
writer.file_extension = 'pdf'
writer.options = {
    'coverimage': {
        'param': 'FILENAME',
        'help': 'filename of an image for the cover page',
    }
}

我不知道呈现的 html 是什么样子,但我想它接近实际的 wiki 页面。但由于它是在代码中呈现的,我相信您也可以控制修改。

【讨论】:

  • 谢谢,但我认为您低估了维基百科内容的复杂性。只是将 API 中的原始内容放在一些 HTML 中(我认为这是您的建议)是没有用的。例如,您可以在此处查看原始内容:en.wikipedia.org/w/index.php?title=Samuel_Pepys&action=edit
  • 我找到了您想要的最佳选择。我更新了我的答案。它接受 wiki 输入并可以多种格式(html、pdf、odt、xml 等)输出。
  • 感谢您抽出宝贵时间调查此事。我认为 mwlib 对于我需要的东西来说太过分了。您之前可能是对的,现在由@Tgr 支持,使用 BeautifulSoup 获取 HTML 将是最简单的。老实说,我认为我想做的事情会更容易!
【解决方案2】:

我会使用 HTML 解析,页面内容具有合理的语义(class="infobox" 等),并且有一些类明确用于划分不应在替代视图中显示的内容(print stylesheet 的第一条规则可能有趣)。

也就是说,如果你真的想操作 wikitext,最好的方法是获取它,使用 mwparserfromhell 删除你不喜欢的模板,并使用 parse API 获取修改后的 HTML。或者使用Parsoid API,它是解析器返回的 XHTML/RDFa 的部分重新实现,它具有更丰富的语义元素。

无论如何,尝试设置一个本地 wikitext->HTML 转换器是目前为止你可以完成这项任务的最困难的方法。

【讨论】:

  • 谢谢Tgr。我真的以为我想要的会更简单。我意识到wikitext要复杂得多,但我没有意识到它显然比能够将一些文本传递给简单模块中的简单方法并获取HTML要复杂得多。看起来使用 BeautifulSoup 抓取 HTML 将是最轻松的方式。
  • wikitext 的一个问题是它从未被正确指定,并且主要被定义为大量的正则表达式,在库中复制并不有趣。有一个测试套件涵盖了实践中看到的大部分用法,但不是所有的边缘情况;甚至 parse API 和 Parsoid API(这是维基百科自己在 node.js 中重新实现的解析器)在渲染可能有 0.1% 的页面时存在分歧。
  • 另一个问题是 wikitext 包含模板系统和各种扩展机制,其中一些在 Wikipedia 上大量使用(例如,使用用 Lua 编写的脚本来动态解析模板)。因此,任何希望处理 Wikipedia 页面内容的解析器都需要包含 Lua 编译器等。您可以通过向服务器询问扩展的 wikitext(包含模板、评估脚本等)来避免大部分复杂性,但这是一个非常低级的视图,对操作不是很有用(肯定不如 HTML 有用)。
  • 感谢您的信息。在我的天真中,我认为它就像一个非常复杂的 Markdown 或 BBCode!显然还有很多很多。遗憾的是没有用于抓取呈现的 HTML 的 API,这至少感觉比抓取呈现的页面更强大。
  • 您可以将action=render 附加到URL(请参阅full documentation)。如果您更喜欢合适的 API,解析 API 可以采用页面名称或 ID 而不是任意 wikitext。
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 2013-10-13
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多