2009-06-13 138 views
9

我仍然坚持试图从维基百科解析文章的问题。实际上,我希望解析来自维基百科的文章的信息框部分,即我的应用程序提及国家和每个国家/地区页面,我希望能够显示该国家相应wikipedia文章中的信息框。我在这里使用的PHP - 如果有人有任何代码片段或建议我应该在这里做什么,我将不胜感激。如何抓取维基百科文章的解析信息框?

再次感谢。


编辑

嗯,我有国家名称的数据库表。我有一个脚本,需要一个国家,并显示其细节。我想抓取信息框 - 包含所有国家/地区详细信息图片的蓝色框,因为它来自维基百科,并显示在我的页面上。我想知道一个非常简单和容易的方法 - 或者有一个脚本,它只是将信息框的信息下载到本地远程系统,稍后我可以访问自己的远程系统。我的意思是我打开的思想在这里 - 除了最后的结果我希望看到我的网页上的信息框 - 当然,在底部:)


编辑内容很少维基百科的链接

我想我在http://infochimps.org上找到了我正在寻找的东西 - 他们得到了大量的数据集,我认为是YAML语言。我可以直接使用这些信息,但我需要一种不断更新维基百科信息的方法,尽管我相信信息框很少会改变,特别是o国家,除非有些国家决定改变它的首府城市。

回答

-5

我建议对维基百科进行WebRequest。从那里你将拥有该页面,你可以简单地使用正则表达式,字符爬行或其他你熟悉的表单来解析或查询你需要的数据。本质上是一个屏幕刮!

编辑 - 我会添加到这个答案,你可以使用HtmlAgilityPack为那些在C#土地。对于PHP,它看起来像SimpleHtmlDom。话虽如此,它看起来像维基百科有一个比足够的API。这个问题可能回答您的需求最好的:

Is there a Wikipedia API?

+1

这是浪费资源。 – 2009-06-13 06:14:40

+0

对不起 - 我可以看到你的意思是巨大的资源浪费。每次当您网站上的某个人需要查看该网页时,我并不是故意要刮掉网页。我认为你可以在离线状态下(如果你选择这样做)将其存储在应用程序的本地数据库中(对所有相关方而言效率更高)。不是故意吸引火焰! :P – 2009-06-13 06:41:46

+0

@Andrew - 我接受所有可能性 - 但我不确定如何开始。有什么样的工作代码我可以看看开始呢? – Ali 2009-06-13 10:23:15

10

我建议你使用DBPedia代替它已经完成转向维基百科中的数据转化为可用,可链接,打开的窗体的工作。

2

这取决于你想要走什么路线。这里有一些可能性:

  1. 安装MediaWiki和适当的 修改。它毕竟是一个 PHP应用程序设计精确解析 wikitext ...
  2. 下载static HTML version,并解析出你想要的部分。
  3. 使用Wikipedia API进行适当的缓存。

不要正好砸在最新版本的直播页面,然后重新进行解析每一个你的应用程序想要箱的时间。这对于您和维基媒体来说都是巨大的资源浪费。如果要分析一个时间的所有文章

2

有一些语义数据提供者,从中可以提取,而不是试图手动分析它的结构化数据:

  • DBpedia中 - 前面已经提到提供SPARQL端点这可能是使用了数据的查询。有许多库可用于多种平台,包括PHP。

  • Freebase - 另一个创意公用数据提供商。初始数据集基于解析的维基百科数据,但有一些信息来自其他来源。任何人都可以编辑数据集,与维基百科相比,您可以使用自定义模式将自己的数据添加到自己的名称空间中。使用自己的称为MQL的查询语言,它基于JSON。数据有WebID链接回相关维基百科文章。免费的基地还提供了一些可下载的数据转储。 Freebase有许多客户端库,包括PHP。

  • Geonames - 地理位置数据库。具有提供给定坐标,附近位置(例如城市,火车站等)的国家和地区信息的API

  • Opensteetmap - 社区建立的世界地图。有API允许按位置和类型查询对象。

  • 维基卫星地图API - 另一个位置服务

14

我会用维基百科(维基)API。您可以以JSON,XML,PHP本机格式和其他方式获取数据。然后,您仍然需要解析返回的信息以提取和格式化所需的信息,但信息框的开始,停止和信息类型已清除。

针对rvsection = 0运行您的查询,因为此第一部分在第一个分节符之前为您提供材料,包括信息框。然后你需要解析信息框内容,这不应该太难。请参阅en.wikipedia.org/w/api.php获取正式的wikipedia API文档,以及www.mediawiki.org/wiki/API获取该手册。

运行,例如,查询:http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xmlfm&titles=fortran&rvsection=0

2

要加载解析后的第一部分中,只要这个参数添加到API URL的结尾

rvparse 

像这样: http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=xmlfm&titles=fortran&rvsection=0&rvparse

然后解析html以获取信息框表格(使用正则表达式)

$url = "http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&titles=Niger&rvsection=0&rvparse"; 
    $data = json_decode(file_get_contents($url), true); 
    $data = current($data['query']['pages']); 
    $regex = '#<\s*?table\b[^>]*>(.*)</table\b[^>]*>#s'; 
    $code = preg_match($regex, $data["revisions"][0]['*'], $matches); 
    echo($matches[0]);