使用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
相关产品推荐
相关产品推荐

