这是一个有点难以理解的问题,但我会尽力解释它。首先,让我展示一个示例页面:
http://en.wikipedia.org/wiki/African_bush_elephant
这是一个维基百科页面,特别是一个硬币页面,因为它的右侧有“taxobox”。我正在尝试使用 PHP 解析该分类箱中的属性。维基百科中有两种方法可以创建这样的分类箱:手动或使用特殊的“自动分类箱”模板。
我可以解析手册。我使用维基百科的 API 以 json 格式返回页面内容,接下来我使用一些正则表达式来获取这些属性。
但是,对于自动分类箱,返回的内容如下:
> {{automatic taxobox | name = African Bush Elephant<ref
> name=MSW3>{{MSW3 Proboscidea | id = 11500009 | page =
> 91}}</ref> | status = VU | status_system = iucn3.1 | status_ref
> = <ref name=IUCN>{{IUCN2010|assessors=Blanc, J.|year=2008|version=2010.1|id=12392|title=Loxodonta
> africana|downloaded=04 April 2010}}</ref> | trend = unknown |
> image = African Bush Elephant.jpg | taxon = Loxodonta africana |
> synonyms = ''Loxodonta africana africana'' | binomial = ''Loxodonta
> africana'' | binomial_authority = ([[Johann Friedrich
> Blumenbach|Blumenbach]], 1797) }}
如果您将其与维基百科上看到的实际页面进行比较,您会发现缺少几个属性。例如,属性“Kingdom”在真实页面上可见,但此处未返回。还有更多类似的属性缺失。
这就像由于模板需要维基百科的服务器端命令将模板转换为实际输出一样。我了解到该 API 有一个“expandtemplates”操作,您可以发送类似于上面的代码片段,然后您将获得用户看到的返回结果。我将其用于多个模板并且它有效,但不幸的是不适用于自动分类框模板。单击此链接查看 Expandtemplates 返回的内容:
如您所见,模板实际上并未展开。相反,它显示更多的模板,嵌套并重复多次。
所以现在我一直试图从具有自动分类框模板的页面读取这些属性。我能想到的唯一的其他方向是不使用 API 并只解析实际页面的 html。这对于某些属性来说是可行的,但其他属性则非常难以解析。
最佳答案
使用action=parse
而不是action=expandtemplates
。正如您所注意到的,expandtemplates
仅扩展单个级别;此外,它不会完全预处理输入(例如,它不会成功处理模板内的某些变量引用)。
关于php - 如何获取复杂的维基百科模板的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8933936/