如何将循环爬取的多国家数据拼接并保存到单个文件中?
问题原因及解决方案
你的代码只保存最后一个国家数据的核心问题有两个:
- 数据列表被重复初始化:
data = []放在了国家循环内部,每次遍历新国家时都会清空之前收集的数据,导致最终只保留最后一个国家的内容。 - 文件被重复覆盖写入:
df.to_csv()放在了内层的领导人遍历循环里,每次处理一个领导人就会写入一次文件,前面的内容会被后续写入覆盖,而且前面国家的数据也没被累积。
修正后的代码
from bs4 import BeautifulSoup import requests import pandas as pd # 把数据列表初始化移到国家循环外,用于累积所有国家的数据 data = [] ctry_list = ["afghanistan","albania"] for ctry in ctry_list: url = f"https://www.cia.gov/resources/world-leaders/foreign-governments/{ctry}" page = requests.get(url) soup = BeautifulSoup(page.content, "html.parser") # pep_list变量未用于存储,可直接移除 for e in soup.select('.leader-info'): d = { 'country': ctry, 'title': e.h4.text, 'first_name': ' '.join([s for s in e.p.text.split() if not s.isupper()]), 'last_name': ' '.join([s.capitalize() for s in e.p.text.split() if s.isupper()]) } # 把每个领导人的数据添加到全局的data列表中 data.append('|'.join(d.values())) print('|'.join(d.values())) # 所有数据收集完成后,统一创建DataFrame并写入文件 df = pd.DataFrame(data) df.to_csv('output_files/FILE.txt', index=False)
可选优化:用字典存储数据(可读性更强)
如果后续需要处理数据,用字典列表存储会比字符串更灵活,修改如下:
from bs4 import BeautifulSoup import requests import pandas as pd data = [] ctry_list = ["afghanistan","albania"] for ctry in ctry_list: url = f"https://www.cia.gov/resources/world-leaders/foreign-governments/{ctry}" page = requests.get(url) soup = BeautifulSoup(page.content, "html.parser") for e in soup.select('.leader-info'): d = { 'country': ctry, 'title': e.h4.text, 'first_name': ' '.join([s for s in e.p.text.split() if not s.isupper()]), 'last_name': ' '.join([s.capitalize() for s in e.p.text.split() if s.isupper()]) } data.append(d) print(f"{ctry}|{d['title']}|{d['first_name']}|{d['last_name']}") # 直接用字典列表生成DataFrame,保留列名结构 df = pd.DataFrame(data) df.to_csv('output_files/FILE.txt', index=False, sep='|')
关键改动说明
- 将
data = []移到国家循环外部,确保所有国家的领导人数据都能被累积到同一个列表中。 - 将文件写入操作移到整个循环结束后,避免重复覆盖文件,一次性写入所有数据。
- 字典存储方式让数据结构更清晰,后续修改或分析数据时更方便。
内容的提问来源于stack exchange,提问作者John Al
相关产品推荐
相关产品推荐

