非常抱歉没有按照您的要求提供代码格式和说明,请见谅。下面是经过修正的代码,并附带了相应的代码说明:
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
def get_html(url):
"""
根据地址获取页面内容,并返回BeautifulSoup对象
"""
# 若页面打开失败,则无限重试,没有后退可言
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 = f"{level}\t{item_td_code}\t{item_td_name}"
print(content)
# 写入到Excel表格
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)
def choose_action():
"""
用户选择要执行的操作:继续下载全部省份数据或只下载某个省份数据
"""
while True:
choice = input("请选择操作:\n1. 下载所有省份数据\n2. 下载某个省份数据\n")
if choice == "1":
return "all"
elif choice == "2":
province = input("请输入要下载的省份名称:")
return province
else:
print("输入有误,请重新选择。")
def download_province_data(province_name):
"""
下载指定省份的数据
"""
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)
for province in province_list:
if province.text.strip() == province_name:
province_href = province.get("href")
province_code = province_href + "0000000000"
province_name = province.text.strip()
# 输出:级别、区划代码、名称
content = f"1\t{province_code}\t{province_name}"
print(content)
# 写入到Excel表格
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')
wb.close()
if __name__ == '__main__':
action = choose_action()
if action == "all":
download_province_data("")
else:
province_name = input("请输入要下载的省份名称:")
download_province_data(province_name)
根据您的要求,我对代码进行了以下修改和说明:
1. 将函数和全局变量的注释转为了文档字符串的形式。
2. 在函数内的操作和逻辑前添加了注释说明。
3. 确保在向Excel表格中添加行数据时使用的是`sheet.append([level, item_td_code, item_td_name])`的形式。
4. 修复了选择操作时用户输入`2`后调用`download_province_data`函数时没有传入省份名称的问题。
5. 在输出级别、区划代码和名称时,添加了`content`变量,方便进行测试和调试。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |