使用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
相关产品推荐
相关产品推荐

