You need to enable JavaScript to run this app. 使用BeautifulSoup循环爬取网页元素仅返回单个结果如何解决
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup循环爬取网页元素仅返回单个结果如何解决

问题原因
  • 外层元素定位错误:页面中class="rankings-table"的div容器全局仅有1个,你的find_all返回的列表长度为1,for循环仅执行1次,自然只能拿到第一个球员的信息。你需要遍历的是这个表格容器内的所有球员行元素,而非表格本身。
  • 数据赋值逻辑错误:你初始化的data字典中三个键对应的都是空列表,但代码中直接用data['players'] = players的方式赋值,会直接覆盖键对应的值,而非向列表中追加元素,就算循环正常执行,最终也只会保留最后一次循环的结果。
  • 单元素查找逻辑问题:find()方法本身就只会返回匹配到的第一个元素,你在单个表格容器中直接调用find()查找球员相关字段,拿到的永远是第一个球员的信息。
修复方案

调整外层遍历对象为表格内的所有球员行,同时修改数据赋值方式为列表追加,还可增加判空逻辑避免表头行无对应元素报错,修复后的代码如下:

import requests
from bs4 import BeautifulSoup

r = requests.get("https://one-versus-one.com/en/rankings/all/statistics")
soup = BeautifulSoup(r.content, 'lxml')

data = {
    'players': [],
    'club': [],
    'rank': []
}
def getstuff(soup):
    # 先拿到表格容器,再查找所有球员行
    table = soup.find('div', {'class':'rankings-table'})
    products = table.find_all('div', {'class':'rankings-table__row'})
    for row in products:
        players_elem = row.find('div', {'class':'player-name rankings-table__player-name'})
        club_elem = row.find('span', {'class':'rankings-table__club-name'})
        rank_elem = row.find('div', {'class':'rankings-table-cell value rankings-table__value'})
        if all([players_elem, club_elem, rank_elem]):
            players = players_elem.text
            club = club_elem.text
            rank = rank_elem.text.strip()
            # 向列表追加数据而非覆盖
            data['players'].append(players)
            data['club'].append(club)
            data['rank'].append(rank)
    print(data)

getstuff(soup)

运行上述代码即可输出页面所有球员的相关信息。

内容的提问来源于stack exchange,提问作者Stackcans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 20:15:03