9

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

再次感谢。


编辑

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


编辑

我想我在http://infochimps.org上找到了我想要的东西——他们有大量的数据集,我认为是 YAML 语言。我可以直接使用这些信息,但我需要一种方法来不时地从维基百科不断更新这些信息,尽管我相信信息框很少改变,尤其是在国家/地区,除非某个国家决定更改其首都左右。

4

9 回答 9

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

于 2010-11-30T00:02:31.643 回答
10

我建议您改用DBPedia,它已经完成了将维基百科中的数据转换为可用、可链接、开放形式的工作。

于 2009-06-13T06:12:59.130 回答
2

这取决于你想走什么路线。以下是一些可能性:

  1. 安装 MediaWiki 并进行适当的修改。毕竟,它是一个专为解析 wikitext 而设计的 PHP 应用程序......
  2. 下载静态 HTML 版本,并解析出您想要的部分。
  3. 使用带有适当缓存的Wikipedia API 。

不要只是点击最新版本的实时页面并在您的应用每次需要该框时重做解析。这对您和维基媒体来说都是一种巨大的资源浪费。

于 2009-06-13T06:14:03.820 回答
2

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

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

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

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

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

  • Wikimapia API - 另一个位置服务

于 2010-11-17T04:52:28.487 回答
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 得到 infobox 表(使用 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]);
于 2015-04-21T16:32:52.727 回答
1

如果您想一次性解析所有文章,维基百科提供所有 xml 格式的文章,

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

否则,您可以筛选单个文章,例如

于 2009-06-13T06:15:09.030 回答
0

稍微更新一下:维基百科信息框中的许多数据现在取自Wikidata,这是一个免费的结构化信息数据库。例如,请参阅德国的数据页面,以及https://www.wikidata.org/wiki/Wikidata:Data_access以获取有关如何以编程方式访问数据的信息。

于 2018-08-01T17:51:44.517 回答
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
于 2021-05-01T14:17:29.160 回答
-6

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

编辑 - 我会在这个答案中补充一点,您可以将 HtmlAgilityPack 用于 C# 领域的用户。对于 PHP,它看起来像 SimpleHtmlDom。话虽如此,看起来 Wikipedia 有一个绰绰有余的 API。这个问题可能最能满足您的需求:

有维基百科 API 吗?

于 2009-06-13T06:05:55.573 回答