在PHP中解析维基百科标记的最佳方法是什么?

时间:2011-12-24 10:29:47

标签: php wikipedia wikipedia-api

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

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

我取得了一些成功。我可以检测到这个页面是一个“specie”页面,我也可以将Taxobox(右侧)的信息解析成一个结构。到目前为止一切都很好。

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

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

{{转换| 350 | - | 680 |公斤|简称=上}}

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

我的困境如下:

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

理想情况下,有一个库可以解决这个问题,但我还没有找到一个可以解决这个问题的工具。我还看了一下结构化的维基百科数据库,比如DBPedia,但那些只有我已经拥有的相同结构,他们没有在Wiki文本本身提供任何结构。

1 个答案:

答案 0 :(得分:3)

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

wiki syxtax非常复杂,有很多怪癖,没有正式的规范。这意味着创建自己的解析器太多了,你应该使用MediaWiki中的解析器。

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

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