BeautifulSoup爬取分页数据时name、surname字段重复问题修复
错误原因
你的代码存在两个核心逻辑问题导致姓名字段重复:
- 存储单条记录的字典
wev定义在了所有循环的最外层,整个爬取过程全程复用同一个字典对象,每次给字典赋值都会覆盖上一条记录的内容,最终追加到列表temp中的所有元素都是同一个字典的引用,所有条目都会显示最后一次写入的姓名 - 表格遍历逻辑错误:目标页面的成员表格只有1个
<tbody>标签,内部的每一行<tr>才对应单个成员的姓名、姓氏字段,你当前直接遍历tbody,只会拿到表格最后一行的姓名值,没有和后续提取的地址、邮箱等详情块做一一对应
另外代码中字典键名前后带多余空格,会导致最终生成的DataFrame出现冗余列名。
修正后代码
import requests import pandas as pd from bs4 import BeautifulSoup headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" } temp = [] for page in range(1, 5): r = requests.get( f"https://www.aeafa.es/asociados.php?provinput=&_pagi_pg={page}", headers=headers, ) soup = BeautifulSoup(r.content, "lxml") # 提取当前页所有成员的姓名、姓氏 details_table = soup.find('table', class_="table") name_list = [] for tr in details_table.find('tbody').find_all('tr'): td_content = [td.text.strip() for td in tr.find_all("td")] name_list.append( (td_content[0], td_content[1]) ) # 提取当前页所有成员的详情信息 detail_blocks = soup.find_all("div", class_="col-md-8 col-sm-8") # 按索引匹配姓名和对应详情 for idx, block in enumerate(detail_blocks): # 每条记录新建独立字典,避免值覆盖 wev = {} p_content = [p.text.strip() for p in block.find_all("p")] # 匹配对应姓名 wev['Nombre'] = name_list[idx][0] wev["Apellidos"] = name_list[idx][1] # 提取各字段,统一去除多余空白 wev["Dirección"] = p_content[2][12:].strip() wev["Población"] = p_content[3][14:].strip() wev["Provincia"] = p_content[4][14:].strip() wev["Teléfono"] = "+" + p_content[5][11:].replace(".", "").replace("-", "").strip() wev["Email"] = p_content[6][10:].strip() temp.append(wev) df = pd.DataFrame(temp) print(df) # 如需导出csv可放开下面注释 # df.to_csv("aeafa_members.csv", index=False, encoding="utf-8-sig")
修正说明
- 单条记录的字典初始化移入详情遍历循环内部,每条记录独立存储,彻底解决值覆盖问题
- 先提取当前页所有姓名组成列表,再通过索引和详情块一一匹配,避免姓名错位、重复
- 统一清理所有字段前后的多余空白,移除字典键名的多余空格,最终输出的DataFrame结构规整
- 修正了请求URL中多余的HTML转义符,避免请求参数异常
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

