我如何获取维基百科文章的解析信息框?

时间:2009-06-13 05:57:26

标签: php wikipedia wikipedia-api

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

再次感谢。


修改

我有一个包含国家名称的数据库表。我有一个脚本,需要一个国家,并显示其详细信息。我想抓住信息框 - 带有所有国家详细信息图片等的蓝色框,因为它来自维基百科并在我的页面上显示。我想知道一个非常简单易行的方法 - 或者有一个脚本只是将信息框的信息下载到本地远程系统,以后我可以自己访问。我的意思是我对这里的想法持开放态度 - 除了我想要的最终结果是在我的页面上看到信息框 - 当然在底部有一些基于维基百科的内容链接:)


修改

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

9 个答案:

答案 0 :(得分:14)

我会使用维基百科(维基媒体)API。您可以使用JSON,XML,php本机格式和其他格式获取数据。然后,您仍然需要解析返回的信息以提取和格式化您想要的信息,但信息框的开始,停止和信息类型是明确的。

运行您的查询只是rvsection = 0,因为第一部分会在第一个分节符之前获取材料,包括信息框。然后你需要解析信息框内容,这不应该太难。有关正式的维基百科api文档,请参阅en.wikipedia.org/w/api.php;有关本手册,请参阅www.mediawiki.org/wiki/API。

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

答案 1 :(得分:10)

我建议您使用DBPedia代替已经完成将维基百科中的数据转换为可用,可链接,开放的表单的工作。

答案 2 :(得分:2)

这取决于你想去的路线。以下是一些可能性:

  1. 使用适当的安装MediaWiki 修改。毕竟是一个 PHP应用程序设计精确解析 wikitext的...
  2. 下载static HTML version,然后解析出您想要的部分。
  3. 使用Wikipedia API和适当的缓存。
  4. 不要只需点击最新版本的实时页面,并在每次应用需要该框时重做解析。这对您和维基媒体来说都是一种巨大的资源浪费。

答案 3 :(得分:2)

有许多语义数据提供程序,您可以从中提取结构化数据,而不是尝试手动解析它:

  • DbPedia - 如前所述,提供了可用于数据查询的SPARQL端点。有许多库可用于多个平台,包括PHP。

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

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

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

  • Wikimapia API - 其他位置服务

答案 4 :(得分: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以获取信息框表(使用Regex)

    $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]);

答案 5 :(得分:1)

如果你想解析所有文章的一次,维基百科有xml格式的所有文章可用,

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

否则你可以屏蔽单个文章,例如

答案 6 :(得分:0)

要对此进行一些更新:Wikipedia信息框中的许多数据现在都来自Wikidata,这是一个免费的结构化信息数据库。例如,请参见data page for Germany,有关如何以编程方式访问数据的信息,请参见https://www.wikidata.org/wiki/Wikidata:Data_access

答案 7 :(得分:0)

def extract_infobox(term):
    url = "https://en.wikipedia.org/wiki/"+term
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    tbl = soup.find("table", {"class": "infobox"})
    if not tbl:
        return {}
    list_of_table_rows = tbl.findAll('tr')
    info = {}
    for tr in list_of_table_rows:
        th = tr.find("th")
        td = tr.find("td")
        if th is not None and td is not None:
            innerText = ''
            for elem in td.recursiveChildGenerator():
                if isinstance(elem, str):
                    # remove references
                    clean = re.sub("([\[]).*?([\]])", "\g<1>\g<2>", elem.strip())
                    # add a simple space after removing references for word-separation
                    innerText += clean.replace('[]','') + ' '
                elif elem.name == 'br':
                    innerText += '\n'
            info[th.text] = innerText
    return info

答案 8 :(得分:-5)

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

编辑 - 我想补充一点,你可以在C#land中使用HtmlAgilityPack。对于PHP,它看起来像SimpleHtmlDom。虽然说维基百科看起来有一个足够的API。这个问题可能最能满足您的需求:

Is there a Wikipedia API?