|
发表于 2024-4-13 23:50:01
|
显示全部楼层
抱歉,我对代码进行了误解。你的代码只下载并存储了省级行政区划(province_code和province_name),而没有继续下载其他级别的行政区划数据。要解决这个问题,你需要做一些修改来确保递归地下载和存储所有级别的行政区划数据。下面是修改后的代码示例:# -*-coding:utf-8-*-import requestsfrom bs4 import BeautifulSoupfrom openpyxl import Workbook# 根据地址获取页面内容,并返回BeautifulSoupdef get_html(url): # 若页面打开失败,则无限重试,没有后退可言 while True: try: # 超时时间为1秒 response = requests.get(url, timeout=1) response.encoding = "GBK" if response.status_code == 200: return BeautifulSoup(response.text, "lxml") else: continue except Exception: continue# 获取地址前缀(用于相对地址)def get_prefix(url): return url# 递归抓取下一级行政区划def spider_next(url, level, sheet): if level == 2: spider_class = "citytr" elif level == 3: spider_class = "countytr" elif level == 4: spider_class = "towntr" else: spider_class = "villagetr" for item in get_html(url).select("tr." + spider_class): item_td = item.select("td") item_td_code = item_td[0].text.strip() item_td_name = item_td[-1].text.strip() # 输出:级别、区划代码、名称 content = str(level) + "\t" + item_td_code + "\t" + item_td_name print(content) sheet.append([level, item_td_code, item_td_name]) item_href = item.select_one("a") if item_href is not None: sub_url = get_prefix(url) + item_href.get("href") spider_next(sub_url, level + 1, sheet)# 入口if __name__ == '__main__': # 抓取省份页面 province_url = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/index.html" province_list = get_html(province_url).select('.provincetr a') # 创建工作簿 wb = Workbook() sheet = wb.active sheet.title = '行政区划' headers = ['级别', '区划代码', '名称'] sheet.append(headers) try: for province in province_list: province_href = province.get("href") province_code = province_href + "0000000000" province_name = province.text.strip() # 输出:级别、区划代码、名称 content = "1\t" + province_code + "\t" + province_name print(content) sheet.append([1, province_code, province_name]) province_sub_url = get_prefix(province_url) + province_href spider_next(province_sub_url, 2, sheet) # 保存到Excel文件 wb.save(r'E:\Temp\行政区划.xlsx') finally: wb.close()在这个修改后的代码中,我更改了spider_next函数来递归地下载和存储每个级别行政区划的数据。在每个级别的循环中,我找到了对应的代码和名称,并使用`sheet.append([level, item_td_code, item_td_name])`将其添加到工作表中。通过这种方式,程序将逐级下载并保存行政区划数据。希望这次的回答能够解决你的问题!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|