You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pywikibot获取维基百科Infobox属性遇"auto"值问题求助

问题:Pywikibot获取维基百科Infobox时部分属性返回"auto"的原因及解决方法

我正在使用Pywikibot API获取维基百科Infobox中的人口密度、人口数量、海拔等信息,但部分城市(如北京)的population_density_km2属性,API返回值为"auto",其他城市则可获取实际数值。

原因分析

维基百科的Infobox模板中,部分条目会使用auto作为人口密度参数的占位符——系统会自动通过**总人口(population_total)除以总面积(area_km2)**计算出人口密度,而非编辑者手动填写固定数值。Pywikibot的raw_extracted_templates方法提取的是模板的原始参数值,因此会直接拿到这个占位符,而非计算后的实际密度值。

解决方法

方法1:手动计算最直接

既然auto代表自动计算,我们可以直接提取总人口和对应面积的数值,自行计算人口密度:

  • 从Infobox中提取population_total(总人口)和area_km2(平方公里面积)的数值
  • 对数值做清洗(去除非数字字符,比如逗号、单位)
  • 用总人口除以面积得到人口密度

方法2:获取渲染后的页面内容

如果不想自行计算,可以获取维基百科渲染后的页面内容(比如HTML),从中提取已经计算好的密度数值。但这种方法需要处理HTML解析,复杂度更高。

方法3:调用MediaWiki API获取解析后数据

通过MediaWiki的parse API接口,请求页面的解析结果,直接提取渲染后的Infobox数据,这种方法能拿到系统计算后的实际值,但需要额外的API调用。

修改后的示例代码

以下是实现方法1的代码,自动处理auto情况并计算人口密度:

import pywikibot
import re

def get_page(city: dict): 
    """返回解析后的维基百科页面"""
    page_title = re.search(r'wiki/(.*)', city['article']['value']).group(1)
    page = pywikibot.Page(pywikibot.Site('en', 'wikipedia'), page_title)
    if page.pageid == 0:
        raise Exception('页面不存在')
    return page

def extract_numeric_value(value_str):
    """从字符串中提取纯数字数值(处理带逗号、单位的情况)"""
    if not value_str:
        return None
    # 提取数字部分(包括小数)
    num_match = re.search(r'[\d,.]+', str(value_str))
    if not num_match:
        return None
    num_str = num_match.group().replace(',', '')
    try:
        return float(num_str)
    except ValueError:
        return None

def get_info_box_details(templates):
    """获取Infobox详情,处理population_density_km2为auto的情况"""
    infobox_params = {}
    for tmpl, params in templates:
        if 'Infobox' in tmpl:
            infobox_params.update(params)
            break  # 只取第一个Infobox
    
    # 提取人口相关数据
    population_data = {}
    for key, value in infobox_params.items():
        if 'population' in key:
            population_data[key] = value
    
    # 处理population_density_km2为auto的情况
    if population_data.get('population_density_km2') == 'auto':
        total_pop = extract_numeric_value(infobox_params.get('population_total'))
        area_km2 = extract_numeric_value(infobox_params.get('area_km2'))
        if total_pop and area_km2:
            calculated_density = round(total_pop / area_km2, 2)
            population_data['population_density_km2'] = calculated_density
        else:
            population_data['population_density_km2'] = None  # 无法计算时设为None
    
    print(population_data)
    return population_data

# 示例调用(假设city字典包含article.value字段)
city = {"article": {"value": "https://en.wikipedia.org/wiki/Beijing"}}
wiki_page = get_page(city)
templates = wiki_page.raw_extracted_templates
info_box = get_info_box_details(templates)

内容的提问来源于stack exchange,提问作者Ankit Agarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:40:30