使用BeautifulSoup的find_all方法爬取sofifa网站返回空列表如何解决
爬虫抓取sofifa球员数据解决方案
错误原因排查
soup.find_all()传参不符合语法规范:该方法第一个参数需传入要查找的HTML标签名,类名需通过class_关键字参数传入,直接传入带尖括号的标签字符串属于语法错误,必然返回空列表- 缺少请求头触发反爬:目标网站会校验请求头的
User-Agent字段,无该字段的请求会被拦截,返回的页面不含球员列表数据 - 元素定位规则不精准:你选中的
bp3-text-overflow-ellipsis类全站多处使用,无法准确定位到需要的球员相关字段
正确实现代码
import requests from bs4 import BeautifulSoup import pandas as pd # 配置请求头模拟浏览器访问,绕过基础反爬 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } url = "https://sofifa.com/players?offset=0" resp = requests.get(url, headers=headers) soup = BeautifulSoup(resp.content, 'lxml') player_list = [] # 定位球员列表的每一行数据 rows = soup.find_all('tr', class_="list") for row in rows: # 提取姓名 name_tag = row.find('div', class_="bp3-text-overflow-ellipsis") name = name_tag.text.strip() if name_tag else "" # 提取年龄 age_td = row.find('td', class_="col col-ae") age = age_td.text.strip() if age_td else "" # 提取所属球队 team_tag = row.find('div', class_="bp3-text-overflow-ellipsis subtitle") team = team_tag.text.strip() if team_tag else "" player_list.append({ "球员姓名": name, "年龄": age, "所属球队": team }) # 打印结果,也可以取消下方注释导出为csv文件 df = pd.DataFrame(player_list) print(df) # df.to_csv("sofifa球员数据.csv", index=False, encoding="utf_8_sig")
关键语法说明
find_all('标签名', class_="类名")是BeautifulSoup定位指定类名元素的标准写法,不要直接传入带尖括号的HTML片段作为参数- 针对有反爬的网站,请求时添加
User-Agent请求头是基础操作,可直接从浏览器开发者工具的网络请求中复制你当前浏览器的UA值使用 - 定位元素前可先打印
resp.text确认返回的页面内容是否和浏览器访问的页面一致,避免被反爬拦截后找不到元素的问题
内容的提问来源于stack exchange,提问作者omkar katare
相关产品推荐
相关产品推荐

