由于人工填写的省市县数据存在格式不规范、数据不准确等原因,因此数据库常常保存的省市县数据都是以行政区划代码形式保存的,但是读取对应数据的时候我们又希望获取其对应的地区名,因此从官方网站获取行政区划和相应地址字典就很有必要。
本文爬取了中华人民共和国民政部的行政区划数据,如果最新数据有更新,更新对应代码片段即可。
导入基本库
import requests
from lxml import etree
解析网页
# 此处为2020年12月中华人民共和国县以上行政区划代码,可对应更改为最新地址
url = 'https://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html'
r = requests.get(url).text
html = etree.HTML(r)
获取行政区划代码
c = html.xpath('//*[@id="2020年12月份县以上行政区划代码_28320"]/table/tr/td[2]//text()')
len(c)
获取单位名称
d = html.xpath('//*[@id="2020年12月份县以上行政区划代码_28320"]/table/tr/td[3]/text()')
len(d)
检查行政区划代码和单位名称,发现len(c)=3210,len(d)=3212,二者长度不一致
检查原网页,发现三沙市的两个区缺失行政区划代码但出现在单位名称中,因此将这两个数据从中删除
d.remove('西沙区')
d.remove('南沙区')
len(d)
将两列数据匹配为字典
# 匹配时舍去了第一行(标题行)
city_code = dict(zip(c[1:], d[1:]))
将字典保存为json文件,便于后续使用
import json
with open(r'city_and_code.json', 'w+', encoding='GBK') as f:
f.write(json.dumps(city_code, ensure_ascii=False, indent=2)) # 缩进2字符
实际使用时直接从json文件中获取该字典
with open(r'city_and_code.json', "r", encoding="GBK") as f:
dict_ = json.load(f)
print(dict_)