获取某些信息框属性的自动值

问题描述 投票:0回答:2

我正在使用 pywikibot api 来获取维基百科信息框属性。我想要提取的很少有人口密度、人口、海拔等。对于某些城市,例如(https://en.wikipedia.org/wiki/Beijing),API 返回“auto”作为键值如人口密度平方公里。对于其他几个城市,我得到的是实际密度而不是汽车密度。任何人都知道这背后的原因以及我如何获得实际值?


import pywikibot
def get_page(city: dict) : 
    """
    Returns parsed wikipedia page
    """
    page = pywikibot.Page(en_wiki, re.search(r'wiki/(.*)', city['article']['value']).group(1))
    if page.pageid == 0:
        raise Exception('page do not exist')

    return page

def get_info_box_details(templates: dict):
    """
    Get info box details
    """
    infobox_template = []
    for tmpl, params in templates:
        if 'Infobox' in tmpl:
            infobox_template.append(params)
    population = { k:v for my_dict in infobox_template  for k,v in my_dict.items() if 'population' in k}
    print(population)

wiki_page = get_page(city)

templates = wiki_page.raw_extracted_templates
info_box = get_info_box_details(templates)
mediawiki wikipedia wikipedia-api pywikibot
2个回答
0
投票

来自模板:Infobox_settlement 的文档

要自动计算相对于总面积的密度,请键入

auto
代替任何密度值。

因此,

auto
意味着信息框模板(MediaWiki)将尝试使用面积和人口值来计算该值。至于推理,我想这会减少冗余,这应该会减轻人类编辑者的模板维护负担。

您可以在 Python 程序中执行相同的操作(通过将人口除以面积来计算密度;类似于模板的做法),或者您可能希望直接从页面的 HTML 输出中抓取数据(这将有其自身的挑战) ).


0
投票

考虑使用 wikidata 来获取这些信息。这是一个数据库,其中包含来自信息框的基本信息,但已经解析。

示例查询获取一个国家的人口及其城市人口的总和

© www.soinside.com 2019 - 2024. All rights reserved.