Python提取列表指定元素及Web爬取球员姓名与位置问题
解决方案:从扁平球员列表提取姓名和位置并存入模型
核心思路
你的原始列表是每4个元素对应一位球员(号码、姓名、家乡、位置),所以只需要按4个元素为一组,提取每组的第2位(姓名)和第4位(位置)即可,不用复杂的间隔计数。
方法一:分组处理(最直观不易出错)
如果已经得到了扁平的my_list,直接按4个元素分组提取:
my_list = [1, 'Bob', 'Austin', 'Pitcher', 2, 'Jim', 'New York', 'Catcher', ...] # 提取姓名和位置到新列表 result_list = [] for i in range(0, len(my_list), 4): # 避免列表末尾元素不足4个的情况 if i + 3 < len(my_list): name = my_list[i + 1] position = my_list[i + 3] result_list.extend([name, position]) # 直接存入Player模型 Player.objects.create(name=name, position=position)
方法二:枚举索引判断
利用枚举获取元素索引,筛选出每组中对应姓名(索引%41)和位置(索引%43)的元素:
result_list = [] for idx, item in enumerate(my_list): if idx % 4 == 1 or idx % 4 == 3: result_list.append(item) # 当遍历到位置时,同步存入模型(姓名是当前索引减2的元素) if idx % 4 == 3: Player.objects.create(name=my_list[idx-2], position=item)
优化建议:爬取时直接提取目标字段
与其先把所有字段存入扁平列表再处理,不如在爬取阶段就直接提取姓名和位置,减少中间步骤:
import requests from bs4 import BeautifulSoup # 遍历联盟球队页面(示例代码) team_urls = ["球队URL1", "球队URL2", ...] for url in team_urls: response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 假设页面中每个球员对应一个.player-card元素 player_cards = soup.find_all("div", class_="player-card") for card in player_cards: # 直接提取姓名和位置 name = card.find("span", class_="player-name").text.strip() position = card.find("span", class_="player-position").text.strip() # 直接存入模型 Player.objects.create(name=name, position=position)
为什么你之前的计数判断失败?
你提到的“第2个、第6个及之后每间隔7个”是错误的规律——实际每组是4个元素,下一个姓名的位置是2+4=6,下一个位置是4+4=8,间隔是4而非7,这才是导致计数判断失效的原因。
内容的提问来源于stack exchange,提问作者Kaden Miller
相关产品推荐
相关产品推荐

