You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python网页爬取:如何提取CoreTennis网站中网球选手的排名数字

Python网页爬取:如何提取CoreTennis网站中网球选手的排名数字

嘿Marc,我来帮你搞定这个问题!你现在的代码已经成功定位到了包含排名的div元素,但因为每个div里还带着表示排名变化的span标签,所以输出的是整个节点内容。咱们只需要再进一步提取里面的排名数字就行啦。

问题分析

你用soup2.findAll(class_="rank")拿到的是两个<div class="rank">元素,每个元素里的结构是:排名数字 + 一个包含变化值的span。咱们的目标就是把每个div里的第一个文本内容(也就是排名数字)提取出来。

解决方案

首先可以简化你的代码——其实不需要两次解析BeautifulSoup,一次就足够了。然后遍历每个找到的rank元素,直接提取它的第一个文本节点内容,再去除多余的空白字符就行。

修改后的代码如下:

from bs4 import BeautifulSoup
import requests

URL = 'https://www.coretennis.net/tennis-player/liv-hovde/114585/profile.html'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"}

page = requests.get(URL, headers=headers)
# 只需要一次解析就够了
soup = BeautifulSoup(page.content, "html.parser")

# 找到所有带rank类的div元素
rank_elements = soup.find_all(class_="rank")

player_ranks = []
for element in rank_elements:
    # 提取div里的第一个文本节点,去掉换行和空格
    rank_num = element.contents[0].strip()
    # 确保拿到的是有效内容,然后转成整数(如果需要字符串可以去掉int())
    if rank_num:
        player_ranks.append(int(rank_num))

# 输出结果,比如[450, 3],如果只有一个排名就会是[3]这样
print(player_ranks)

为什么这样有效?

每个rank类的div里,排名数字是第一个子节点(纯文本),后面的span标签是排名变化的数据。用element.contents[0]可以直接定位到这个文本节点,strip()用来清除文本里的换行、空格这些多余字符,最后转成整数方便后续处理(如果不需要整数,直接保留字符串就行)。

额外小提示

  • 如果以后网站结构发生变化(比如class名改了,或者排名的位置变了),你需要重新检查页面的HTML结构来调整代码。
  • 对于只有单个排名的选手,这段代码也能正常工作,结果列表里只会有一个数字。

备注:内容来源于stack exchange,提问作者Marc01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:54:06