【问题标题】:What is the best way to parse Wikipedia markup in PHP?在 PHP 中解析 Wikipedia 标记的最佳方法是什么?
【发布时间】:2011-12-24 10:29:46
【问题描述】:

我正在尝试以结构化的方式解析特定的维基百科内容。这是一个示例页面:

http://en.wikipedia.org/wiki/Polar_bear

我取得了一些成功。我可以检测到这个页面是一个“物种”页面,我还可以将 Taxobox(右侧)信息解析为一个结构。到目前为止一切顺利。

但是,我也在尝试解析文本段落。这些由 API 以 Wiki 格式或 HTML 格式返回,我目前正在使用 Wiki 格式。

我可以阅读这些段落,但我想以特定方式“清理”它们,因为最终我将不得不在我的应用程序中显示它并且它没有 Wiki 标记的意义​​。例如,我想删除所有图像。通过过滤掉 [[Image:]] 块相当容易。然而,也有一些我根本无法删除的块,例如:

{{convert|350|-|680|kg|abbr=on}}

删除整个块会破坏句子。并且有几十个这样的符号具有特殊的含义。我想避免编写 100 个正则表达式来处理所有这些,看看如何以更智能的方式解析它。

我的困境如下:

  • 我可以继续我目前的半结构化解析路径 有很多工作删除不需要的元素以及“模仿” 确实需要渲染的模板。
  • 或者,我可以从呈现的 HTML 输出开始并对其进行解析,但我担心以结构化方式解析它同样脆弱和复杂

理想情况下,有一个库可以解决这个问题,但我还没有找到适合这项工作的库。我还查看了结构化的 Wikipedia 数据库,例如 DBPedia,但那些只有我已经拥有的相同结构,它们不提供 Wiki 文本本身的任何结构。

【问题讨论】:

标签: php wikipedia wikipedia-api


【解决方案1】:

使用的模板太多,无法手动重新实现所有模板,而且它们一直在变化。因此,您将需要能够处理所有模板的 wiki 语法的实际解析器。

而且wiki syxtax 相当复杂,有很多怪癖并且没有正式的规范。这意味着创建自己的解析器会很费力,您应该使用 MediaWiki 中的解析器。

因此,我认为通过the MediaWiki API 获取解析后的 H​​TML 是您最好的选择。

信息框可能更容易从 wiki 标记中解析出来,所以也许它们应该是一个特例。

【讨论】:

  • 谢谢,我现在采用混合方法。 1)我得到原始的wiki格式并解析出infoxbox,这是可行的。 2) 我使用 action=expandtemplates 转换剩余的 wikitext 3) 然后我解析并转换剩余的块。到目前为止效果很好。
  • MediaWiki API 添加了所有元链接等,非常烦人。或者我使用了错误的功能:dont-starve-game.wikia.com/…
猜你喜欢
  • 2015-06-14
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2010-10-28
  • 2017-03-25
相关资源
最近更新 更多