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

